String 使用for循环变量的Verilog文件名

String 使用for循环变量的Verilog文件名,string,for-loop,verilog,String,For Loop,Verilog,我的问题与下面的问题相似。 根据NUM\u PU的值,我想将输出文件名定义为 serial_pu0.out serial_pu1.out ... etc 以下代码不起作用,因为模拟器将引号(“”)内的字符视为字符串。有什么建议吗 integer file [0:NUM_PU-1]; generate for(i=0;i<NUM_PU;i=i+1) begin : serial_data_gen initial begin file[i]

我的问题与下面的问题相似。

根据
NUM\u PU
的值,我想将输出文件名定义为

serial_pu0.out
serial_pu1.out
... etc
以下代码不起作用,因为模拟器将引号(
“”
)内的字符视为字符串。有什么建议吗

integer file [0:NUM_PU-1];
generate
    for(i=0;i<NUM_PU;i=i+1) begin : serial_data_gen
        initial begin
            file[i] = $fopen ("serial_pu[i].out", "w");
        end
        always@(posedge i_Clk) begin
            if(serial_wr[i]) begin
                $fwrite (file[i], "%c", serial_data_2d[i]);
                $write("%c",serial_data_2d[i]);
            end
        end
    end
endgenerate
整数文件[0:NUM_PU-1];
生成

对于(i=0;i,您可以使用
$sformaf
动态组合文件名

initial begin
    file[i] = $fopen($sformatf("serial_pu%0d.out", i), "w");
end
这将创建文件名:

  • 串行_pu0.out
  • 串行_pu1.out

您可以在Verilog(IEEE Std 1364)中使用
$sformat
动态构造文件名字符串:

模块tb;
参数NUM_PU=2;
整数文件[0:NUM_PU-1];
genvar i;
reg[999:0]文件名;
生成

对于(i=0;我自己没有测试过,但这里似乎有一个答案:谢谢你的回答。$sformatf似乎不适用于Verilog。它似乎只在系统Verilog中受支持。是的,它只在SV标准中,尽管一些模拟器可能支持Verilog。你可能还想尝试
$psprintf
哪个工作ks同样的方式和一些模拟器可能支持。
module tb;

parameter NUM_PU=2;

integer file [0:NUM_PU-1];
genvar i;
reg [999:0] filename;

generate
    for(i=0;i<NUM_PU;i=i+1) begin : serial_data_gen
        initial begin
            $sformat(filename, "serial_pu%0d.out", i);
            file[i] = $fopen(filename, "w");
        end
    end
endgenerate

endmodule