在TB當(dāng)中,直接對(duì)DUT(Design under Test)的信號(hào)進(jìn)行讀寫是很常見的操作。以一個(gè)簡(jiǎn)單的計(jì)數(shù)器例子為例:
定義一個(gè)模塊名為a(取名比較隨意),功能是帶使能和異步復(fù)位的計(jì)數(shù)器,描述如下:
reg [31:0] cnt_r;
assign count = cnt_r;
always @ (posedge clk or posedge rst)
begin
if (rst)
cnt_r <= 'd0;
else if (en)
cnt_r <= count + 32'd1;
end
同時(shí)定義一個(gè)模塊名為b,功能是帶使能、置位和異步復(fù)位的計(jì)數(shù)器,描述如下:
reg [31:0] cnt_r;
assign count = cnt_r;
always @ (posedge clk or posedge rst)
begin
if (rst)
cnt_r <= 'd0;
else if (set)
cnt_r <= load_val;
else if (en)
cnt_r <= count + 32'd1;
end
同時(shí)創(chuàng)建一個(gè)wrapper將模塊b例化,并在TB中完成簡(jiǎn)單的測(cè)試工作:
`include "macros.v"
module tb;
reg clk ;
reg rst ;
reg en ;
reg set ;
wire [31:0] a_cnt;
wire [31:0] b_cnt;
wire [31:0] b_cnt1;
initial begin
clk = 0;
rst = 1;
en = 0;
set = 0;
#100
rst = 0;
#100
en = 1;
#100
set = 1;
#20
set = 0;
#100
$finish;
end
always #10 clk = ~clk;
initial
forever begin
#20
$display("Time: %t A_CNT: %d B_CNT:%d", $time, `A_MODULE_INST.count, `B_MODULE_NAME.count);
end
a a_inst(
.clk(clk) ,
.rst(rst) ,
.en (en) ,
.count (a_cnt)
);
b_wrapper b_inst(
.clk(clk) ,
.rst(rst) ,
.set(set) ,
.load_val(32'd20),
.en(en) ,
.count (b_cnt)
);
`ifdef B_MULT
b_wrapper b_inst_1(
.clk(clk) ,
.rst(rst) ,
.set(set) ,
.load_val(32'd40),
.en(en) ,
.count (b_cnt1)
);
`endif
endmodule
a和b模塊的XMR調(diào)用通過(guò)宏定義控制,在tb的display函數(shù)中使用。宏定義內(nèi)容如下:
`define A_MODULE_INST tb.a_inst
`define B_MODULE_NAME b
//`define B_MULT
所以整體的層次結(jié)構(gòu)如下:
- tb
- a_inst (module a)
- b_inst (module b_wrapper)
- b_inst (module b)
- b_inst_1 (module b_wrapper if define B_MULT)
- b_inst (module b)
Hierarchical Reference
可以看到,a模塊的XMR方式是從頂層的tb開始,根據(jù)Instance name找到的例化的a模塊;這種根據(jù)結(jié)構(gòu)和Instance Name跨模塊調(diào)用的方式叫做Hierarchical Reference, 這也是最常見的方式。
優(yōu)缺點(diǎn)如下:
1.在Verilog的一個(gè)module中,Instance Name是唯一的,所以該種方式指向性很明確,支持精細(xì)化地控制同一個(gè)module例化的不同模塊信號(hào)。
2.但如果層次結(jié)構(gòu)發(fā)生變化,或者Instance Name改變,會(huì)爆出Cross Module Reference Error。
Upwards Name Referencing
b模塊的XMR方式則是直接定義了b模塊的模塊名,然后verilog開始從定義的頂層開始查找,沒(méi)找到就進(jìn)入下一層繼續(xù)尋找,直到找到唯一的那個(gè)模塊名匹配的為止:
它的優(yōu)缺點(diǎn)與Hierarchical Reference正好相反:
1.不用擔(dān)心層次結(jié)構(gòu)和Instance Name的變化會(huì)影響跨模塊調(diào)用。
2.使用該方式需要保證唯一性,不然也會(huì)爆出Cross Module Reference Error。
實(shí)驗(yàn)結(jié)果如下:
在未定義B_MULT時(shí):
定義B_MULT時(shí):
總結(jié):
Hierarchical Reference方式嚴(yán)謹(jǐn)?shù)珶o(wú)靈活性,操作上可實(shí)現(xiàn)精細(xì)化控制,支持多模塊;Upwards Name Referencing方式靈活,但只支持單模塊,應(yīng)用場(chǎng)景限制高。
所以,這也是Hierarchical Reference應(yīng)用廣泛的原因吧,如果不是最近犯錯(cuò),我可能都不會(huì)注意到另一種XMR方式。
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2283瀏覽量
95891 -
Verilog語(yǔ)言
+關(guān)注
關(guān)注
0文章
113瀏覽量
8463 -
DUT
+關(guān)注
關(guān)注
0文章
190瀏覽量
12785
發(fā)布評(píng)論請(qǐng)先 登錄
verilog模塊的調(diào)用、任務(wù)和函數(shù)

請(qǐng)問(wèn)C6748下的兩種DSP開發(fā)方式有什么區(qū)別
請(qǐng)問(wèn)小車轉(zhuǎn)向兩種方式有什么優(yōu)缺點(diǎn)?
Net模塊中的通信傳輸協(xié)議有何優(yōu)缺點(diǎn)
DC-DC和LDO兩種供電模式有什么優(yōu)缺點(diǎn)?
對(duì)兩種左右手傳輸線實(shí)現(xiàn)方式的研究現(xiàn)狀進(jìn)行了深入分析以及優(yōu)缺點(diǎn)對(duì)比

探討VHDL和Verilog模塊互相調(diào)用的問(wèn)題

淺析標(biāo)準(zhǔn)的Verilog對(duì)語(yǔ)句有兩種分組方式

在MATLAB/simulink中建模時(shí)的兩種不同實(shí)現(xiàn)方式
MATLAB/simulink中兩種實(shí)現(xiàn)建模方式的優(yōu)勢(shì)
Verilog中跨模塊調(diào)用的兩種不同方式的優(yōu)缺點(diǎn)討論

兩種用于汽車PCB組件的連接器端子組件的優(yōu)缺點(diǎn)

評(píng)論