使用文件名字符串作为SystemVerilog接口参数?

时间:2015-10-15 09:56:19

标签: system-verilog

是否可以将字符串用作SystemVerilog接口参数。我有4个相同接口的实例,我想知道我是否可以为每个实例包含不同的断言文件。

我的界面如下所示:

interface dai_if #(P_WD_DATA = 24,
                   string P_FILE_NAME = "assertion_file_name")();


    //Internal Signal Defined Here


    `include "assertion_file_name"

endinterface : dai_if

在顶层,我实例化了四个实例,我有以下代码:

module tb_top;

    parameter P_WD_DATA = 24;
    parameter string DAI_SER_IN_FILE  = "dai_ser_in_checkers.v";
    parameter string DAI_SER_OUT_FILE = "dai_ser_out_checkers.v";
    parameter string DAI_PAR_IN_FILE  = "dai_par_in_checkers.v";
    parameter string DAI_PAR_OUT_FILE = "dai_par_out_checkers.v";

然后我实例化每个接口:

dai_if #(.P_WD_DATA(P_WD_DATA),
         .P_FILE_NAME(DAI_SER_IN_FILE))
         dai_ser_ivif();

这是正确的方法,还是我错过了什么?

由于

1 个答案:

答案 0 :(得分:2)

你不能使用参数来定义包含文件,因为`include宏是在评估参数之前很久就执行的(请注意,诸如`include和`define之类的marcos是作为预处理的一部分运行的,而参数是在精化过程中定义和使用的;编译阶段。)

但是,有一些方法可以获得理想的行为。您可以使用它来有条件地实例化包含文件中的代码,而不是使用参数字符串直接包含文件:

module top;
  ...
  myInterface #(.assertType("TYPE1")) myInstance();
  ...

interface myInterface #(parameter assertType = "TYPE0") ();
  ...
  // NOTE: This is NOT inside any process block (like always, initial, etc)
  case (assertType)
    "TYPE0": begin
      `include "assert_type0.sv"
    end
    "TYPE1": begin
      `include "assert_type1.sv"
    end
    "TYPE2": begin
      `include "assert_type2.sv"
    end
  endcase
  ...
endinterface

在上面,在编译期间,将包含来自所有文件的所有断言代码,但是唯一要生效的断言代码将是参数指定的案例的分支中包含的那些,其他的将是没有实例化。