使用文件名字符串作为 SystemVerilog 接口参数?
Using a file name string as a SystemVerilog interface parameter?
是否可以使用字符串作为 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();
这是正确的方法吗,还是我遗漏了什么?
谢谢
您不能使用参数来定义包含文件,因为 `include 宏在评估参数之前很久就已执行(请注意,诸如 `include 和 `define 之类的宏是 运行 作为预处理的一部分,而参数是在细化过程中定义和使用;编译阶段)。
但是,有一些方法可以获得所需的行为。除了使用参数字符串直接包含文件之外,您还可以使用它有条件地实例化包含文件中的代码,如下所示:
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
在上面,在编译过程中,所有文件的所有断言代码都会被包含进来,但唯一生效的是参数指定的case的分支文件中包含的代码,以及其他人将保持未实例化。
是否可以使用字符串作为 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();
这是正确的方法吗,还是我遗漏了什么?
谢谢
您不能使用参数来定义包含文件,因为 `include 宏在评估参数之前很久就已执行(请注意,诸如 `include 和 `define 之类的宏是 运行 作为预处理的一部分,而参数是在细化过程中定义和使用;编译阶段)。
但是,有一些方法可以获得所需的行为。除了使用参数字符串直接包含文件之外,您还可以使用它有条件地实例化包含文件中的代码,如下所示:
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
在上面,在编译过程中,所有文件的所有断言代码都会被包含进来,但唯一生效的是参数指定的case的分支文件中包含的代码,以及其他人将保持未实例化。