0

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

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 时将值写入 cipher.txt(由 if 语句指示)

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

4

1 回答 1

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],您会收到相同的警告吗?

于 2012-06-06T20:23:19.390 回答