如何在 Verilog 中分配模块参数?



我有一个verilog模块,其中包含很长的输入和输出列表。

module mymodule(clock,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16,S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24);

我正在尝试为这个模块编写一个测试台。有没有一种聪明的方法将参数作为数组提供。大约一半的参数是输入,另一半是输出。我试图根据我有限的verilog经验做这样的事情。

reg clk = 0;
reg inputs[16:0] = 0;
wire outputs[23:0];
mymodule tc(clk, inputs, outputs);     

我希望变量"inputs"充当一个数组,它将容纳所有输入,"outputs"也将做同样的事情。

我还希望能够将所有输入设置为随机

inputs = $random; 

有没有办法在Verilog中执行此操作,还是必须手动初始化所有变量?

由于模块是使用单个端口定义的,因此必须单独连接到每个端口。Verilog 不提供内置的自动连接端口方式。

SystemVerilog 有.*个连接,但仅当 net/var 名称与端口名称匹配时,它才有效。因此,使用SystemVerilog,您可以连接中间分配。(注意:所有现代Verilog模拟器都支持大多数(如果不是全部(SystemVerilog功能。只需将文件灭绝从.v更改为.sv即可启用(

logic clock;
logic [15:0] inputs;
wire [22:0] outputs;
wire m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16;
wire S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24;
assign {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16} = inputs;
assign outputs = {S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24};
mymodule tc( .* );

对于一个更干净的解决方案,我推荐Emacs插件Verilog-Mode(vim包装器存在(。此工具专门用于简化长端口列表连接和 Verilog 项目常见的其他重复性任务。例如,以下内容将扩展到索引到索引的连接

/* mymodule AUTO_TEMPLATE (
.m@       (inputs[1]),
.S@       (outputs[1]),
); */
mymodule dut (/*AUTOINST*/);

以下两个模板将以偏移量展开,但显式连接到inputs[13]的模板除外m18(我选择m18是因为我注意到没有m14,它是在m13m15之间定义的(

/* mymodule AUTO_TEMPLATE (
.m@       (inputs[@"(- 1 1)"]),
.S@       (outputs[@"(- 1 6)"]),
); */
mymodule dut (
.m18      (inputs[13]),
/*AUTOINST*/);

/* mymodule AUTO_TEMPLATE (
.m18      (inputs[13]),
.m@       (inputs[@"(- 1 1)"]),
.S@       (outputs[@"(- 1 6)"]),
); */
mymodule dut (/*AUTOINST*/);

除了使用某种代码生成之外,在常规Verilog中,您必须单独连接所有端口。您可以执行以下操作:

reg  [2:0] inp = $random;
wire [2:0] outp;
mymodule my (clk, inp[1:0], inp[2], outp[1:0], outp[2], ...);

将所有内容分配给同一个向量,但仍需要键入所有这些内容。

您可以使用 'define 指令在测试平台中将各个位连接成数组:

`define inputs {m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,m11,m12,m13,m18,m15,m16}
`define outputs {S26,S25,S22,S27,S14,S11,S17,S10,S13,S16,S6,S12,S19,S18,S15,S7,S9,S20,S28,S23,S8,S21,S24}

然后,您可以使用$random任务:

initial
begin
...
`inputs = $random;
...
end

最新更新