Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Verilog中分配模块参数?_Verilog_Hdl_Iverilog - Fatal编程技术网

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

如何在Verilog中分配模块参数?,verilog,hdl,iverilog,Verilog,Hdl,Iverilog,我有一个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模块,它有一个很长的输入和输出列表

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
即可启用)

对于更干净的解决方案,我建议使用Emacs插件()。此工具专门用于简化长端口列表连接和Verilog项目常见的其他重复任务。例如,下面的将扩展为索引到索引的连接

/* mymodule AUTO_TEMPLATE (
  .m@       (inputs[\1]),
  .S@       (outputs[\1]),
); */
mymodule dut (/*AUTOINST*/);
以下两个模板将以偏移量展开,但明确连接到
输入[13]
m18
除外。(我选择了
m18
,因为我注意到没有
m14
,它是在
m13
m15
之间定义的。)


您可以使用`定义指令将单个位连接到测试台中的数组中:

`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 task:

initial
begin

...

`inputs = $random;

...

end

不要将输入变量命名为
input
。这是一个verilog关键字。好吧,把所有输入设置为random怎么样?我是否也必须单独执行此操作?@ched如果使用数组作为输入,则可以使用for循环填充它:
tci tc(clk,in[0],[1],[2]…for(I=0;I)
/* mymodule AUTO_TEMPLATE (
  .m18      (inputs[13]),
  .m@       (inputs[@"(- \1 1)"]),
  .S@       (outputs[@"(- \1 6)"]),
); */
mymodule dut (/*AUTOINST*/);
`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}
initial
begin

...

`inputs = $random;

...

end