如何在 Verilog 中分配模块参数?
How can I assign module arguments in 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 中,您必须单独连接所有端口。你可以这样做:
reg [2:0] inp = $random;
wire [2:0] outp;
mymodule my (clk, inp[1:0], inp[2], outp[1:0], outp[2], ...);
将所有内容分配给同一个向量,但仍需要将所有内容都键入。
由于模块是用单独的端口定义的,因此每个端口都必须单独连接。 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 wrapper exists)。该工具专门用于简化长端口列表连接和 Verilog 项目常见的其他重复性任务。例如,下面将扩展为索引连接
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[]),
.S@ (outputs[]),
); */
mymodule dut (/*AUTOINST*/);
除了 m18
明确连接到 inputs[13]
之外,以下两个模板将使用偏移量展开。 (我选择了 m18
因为我注意到没有 m14
并且它被定义在 m13
和 m15
之间)
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[@"(- 1)"]),
.S@ (outputs[@"(- 6)"]),
); */
mymodule dut (
.m18 (inputs[13]),
/*AUTOINST*/);
或
/* mymodule AUTO_TEMPLATE (
.m18 (inputs[13]),
.m@ (inputs[@"(- 1)"]),
.S@ (outputs[@"(- 6)"]),
); */
mymodule dut (/*AUTOINST*/);
您可以使用 `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
我有一个 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 中,您必须单独连接所有端口。你可以这样做:
reg [2:0] inp = $random;
wire [2:0] outp;
mymodule my (clk, inp[1:0], inp[2], outp[1:0], outp[2], ...);
将所有内容分配给同一个向量,但仍需要将所有内容都键入。
由于模块是用单独的端口定义的,因此每个端口都必须单独连接。 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 wrapper exists)。该工具专门用于简化长端口列表连接和 Verilog 项目常见的其他重复性任务。例如,下面将扩展为索引连接
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[]),
.S@ (outputs[]),
); */
mymodule dut (/*AUTOINST*/);
除了 m18
明确连接到 inputs[13]
之外,以下两个模板将使用偏移量展开。 (我选择了 m18
因为我注意到没有 m14
并且它被定义在 m13
和 m15
之间)
/* mymodule AUTO_TEMPLATE (
.m@ (inputs[@"(- 1)"]),
.S@ (outputs[@"(- 6)"]),
); */
mymodule dut (
.m18 (inputs[13]),
/*AUTOINST*/);
或
/* mymodule AUTO_TEMPLATE (
.m18 (inputs[13]),
.m@ (inputs[@"(- 1)"]),
.S@ (outputs[@"(- 6)"]),
); */
mymodule dut (/*AUTOINST*/);
您可以使用 `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