电子说
先给出 sub_module
module sub(
input [7:0] din,
output logic [7:0] dout
);
assign dout = din;
endmodule
要将这个module分别例化成u_sub_0
和u_sub_1
,并且每个都例化四次
for循环的实现方式如下
module top(
input [8*4-1 : 0] din0,
input [8*4-1 : 0] din1,
output logic [8*4-1 : 0] dout0,
output logic [8*4-1 : 0] dout1
);
genvar i;
generate for(i=0; i<4; i++) begin:inst
sub u_sub_0 (
//output
.dout(dout0[i*8 +: 8]),
//input
.din(din0[i*8 +: 8])
);
sub u_sub_1 (
//output
.dout(dout1[i*8 +: 8]),
//input
.din(din1[i*8 +: 8])
);
end
endgenerate
endmodule
来看看例化后的效果
可以看到,总共4组inst,每组inst中存在两个u_sub
接下来点开inst[0]
中的u_sub_0
,看看它的信号是什么样的
依次点击,然后到shell界面粘贴内容
此时可以清晰的看到,这个din
信号是来自哪里,这也体现了,在begin
后命名block的重要性
同样的 sub_module,同样的例化要求,这次改用数组的方式进行例化
module top(
input [8*4-1 : 0] din0,
input [8*4-1 : 0] din1,
output logic [8*4-1 : 0] dout0,
output logic [8*4-1 : 0] dout1
);
sub u_sub_0 (
//output
.dout(dout0),
//input
.din(din0)
);
sub u_sub_1 (
//output
.dout(dout1),
//input
.din(din1)
);
endmodule
来看看这次的例化效果
在打印出这种方式的层次化结构
同样有清晰的辨识效果
对于二维数组而言,如果想在verdi中将二维数组展开,那么我们需要在dump波形是加上这句话
$fsdbDumpMDA;
这样就可以在verdi中展开二维数组
当一个数组范围比较大不方便分析,可以将数组进行分段,操作如下
比如我要将32 bits位宽的din0信号分成8 bits位宽,可以这样设置
效果如下
实现了对信号的拆分
对于一些信号,在这种例化方式下拉信号的波形不是很容易(这个例子一时没想起来 >_<)
要拉出确定的波形可以这样操作
在波形界面按g
,会弹出下面这个框
让后需要哪个信号选中即可添加
全部0条评论
快来发表一下你的评论吧 !