我正在使用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
任何人都可以提供一些见解和/或帮助我克服这个障碍吗? 感谢。
答案 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]
,您会收到相同的警告吗?