在调用系统任务$ fwrite时,参数3不是常量

时间:2012-06-06 19:12:10

标签: cryptography hardware verilog xilinx

我正在使用Xilinx ISE 10.1来运行一些verilog代码。在代码中,我想在一个文件cipher.txt中写入3个寄存器的寄存器值。以下是代码段:

if (clk_count==528) begin
  f1 = $fopen("cipher.txt", "w");
  $fwrite(f1, "clk: %d", clk_count[11:0]);
  $fwrite(f1, "plain: %h",  plain[31:0]);
  $fwrite(f1, "cipher: %h",  cipher[31:0]);
  $fclose(f1);
end

执行结束时,cipher.txt的内容为:

clk: %dplain: %hcipher: %h

没有遇到其他错误,但会出现与3 fwrite相对应的警告:

Parameter 3 is not constant in call of system task $fwrite.
Parameter 3 is not constant in call of system task $fwrite.
Parameter 3 is not constant in call of system task $fwrite.

寄存器clk_count和cipher的值在每个时钟周期发生变化(寄存器plain的值始终保持不变),当clk_count等于528(由if语句指示)时,值将写入cipher.txt

任何人都可以提供一些见解和/或帮助我克服这个障碍吗? 感谢。

1 个答案:

答案 0 :(得分:1)

似乎ISE希望$fwrite的参数保持不变。警告指的是clk_count[11:0], plain[31:0], and cipher[31:0],它们不是常数。根据定义,它们正在改变每个循环,因此在编译时不知道它们。这也解释了为什么它们不打印,并且您在输出中看到%d%h

我在Verilog规范中没有任何内容要求$fwrite的参数保持不变。相同的代码与Cadence Incisive一样正常工作。我的猜测是它是ISE的限制,因此您可能需要查看Xilinx。

可能的解决方法:

1)使用$swrite创建具有正确格式的字符串。然后将字符串写入文件。

2)尝试在$fwrite的调用中使用中间变量。也许部分选择会把它扔掉。例如

integer foo;
foo = clk_count[11:0];
$fwrite(... , foo , ...);

其中任何一个可能都可以工作。

出于好奇,如果您删除了部分选择,并尝试在没有clk_count的情况下打印[11:0],您会收到相同的警告吗?