【问题标题】:Passing string values to SystemVerilog parameter将字符串值传递给 SystemVerilog 参数
【发布时间】:2014-05-08 23:06:26
【问题描述】:

我在将字符串值传递给 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”应该是一个常数值”。

SV 不支持字符串值作为参数吗?如果不是,为什么当我使用`define 时它接受字符串值?

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

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您没有显示足够的代码来确切知道问题的原因可能是什么。您不能在没有其他上下文的情况下拥有语句 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
    

    【讨论】:

    • 不幸的是,这在模拟中对我不起作用。我收到 localparam 不是常量的错误
    【解决方案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 上的示例

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2016-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      相关资源
      最近更新 更多