将字符串值传递给SystemVerilog参数

时间:2014-05-08 23:06:27

标签: verilog system-verilog

我在将字符串值传递给SystemVerilog中的泛型参数时遇到问题。 模块实例化如下所示。内存将一些值写入FILE_OUT,这是一个通用参数。 我需要生成两个不同的文件 - " file1.txt"和" file2.txt",用于不同的内存实例。

最初我尝试使用`define指令:

if(ch_ID==1)
  `define FILE_OUT file1.txt
else
  `define FILE_OUT file2.txt 

但是,既然`define创建了全局宏,那么模拟总是给出输出" file2.txt"

然后我尝试将文件名作为参数传递

if(ch_ID==1)
  parameter FILE_OUT= "file1.txt"
else
  parameter FILE_OUT= "file2.txt"

memory #(.FILE_OUT (FILE_OUT)) mem

这给了我错误 - " FILE_OUT"应该是一个恒定的值"。

不支持字符串值作为参数吗?如果没有,为什么我在使用`define

时接受字符串值

有人可以帮助我解决这个问题吗?

enter image description here

2 个答案:

答案 0 :(得分:6)

您没有显示足够的代码来准确了解问题的原因。你不能有语句FILE_OUT =" string" l没有其他一些上下文。你应该做的是

module #(int ch_ID) component1(...);

localparam string FILE_OUT = $sformatf("file%0d.txt",ch_ID);

memory #(.FILE_OUT (FILE_OUT)) m1(...);

endmodule

答案 1 :(得分:2)

if条件推断生成块,参数是本地范围的。

if(ch_ID==1)
   parameter FILE_OUT= "file1.txt"; // scope: genblk1.FILE_OUT
else
   parameter FILE_OUT= "file2.txt"; // scope: genblk2.FILE_OUT
// parent scope: genblk1.FILE_OUT and genblk2.FILE_OUT exist, not FILE_OUT

解决方案,内联操作:

parameter FILE_OUT= (ch_ID==1) ? "file1.txt" : "file2.txt";
// FILE_OUT exists in the module's scope with the desired name

edaplayground

上的示例