|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 replaceorstay 于 2023-8-17 14:47 编辑
dut很简单,是一个可变进制计数器,用输入信号ceil作为可计数的最大值,如下:
- module cnt_ceil(
- input clk,
- input rst_n,
- input en,
- input [3:0] ceil,
- output [3:0] cnt,
- output co
- );
- reg [3:0] cnt_reg;
- assign cnt = cnt_reg;
- assign co = (cnt==ceil) && en;
- always@(posedge clk,negedge rst_n) begin
- if(!rst_n)
- cnt_reg <= 4'b0000;
- else
- if(en)
- if(cnt_reg>=ceil)
- cnt_reg <= 4'b0000;
- else
- cnt_reg <= cnt_reg + 1'b1;
- end
- endmodule
复制代码
interface如下:
- interface dut_interface(input logic clk);
- logic rst_n;
- logic en;
- logic [3:0] ceil;
- logic [3:0] cnt;
- logic co;
- modport DUT (
- input rst_n,
- input en,
- input ceil,
- output cnt,
- output co,
- input clk
- );
- endinterface
复制代码 在模块dut_top中例化cnt_ceil并连接interface:
- module dut_top(dut_interface.DUT ifc);
- cnt_ceil cnt_ceil_0(
- .clk (ifc.clk),
- .rst_n (ifc.rst_n),
- .en (ifc.en),
- .ceil (ifc.ceil),
- .cnt (ifc.cnt),
- .co (ifc.co)
- );
- endmodule
复制代码 在测试平台顶层模块top中例化dut_top和一个interface实例并连接:
- //省略include语句
- module top;
- bit clk;
- dut_interface ifc(clk);
- dut_top dut(ifc);
- initial begin
- clk = 1'b0;
- forever #1 clk=~clk;
- end
- initial begin
- //省略其余uvm语句
- run_test();
- end
- endmodule
复制代码
后来我在interface里加了一个时钟块cnt_ceil_cb,在modport DUT中添加该时钟块,在dut_top里用ifc.cnt_ceil_cb.cnt和ifc.cnt_ceil_cb.co连接端口,发现没有报多重驱动的错误,仿真正常,只是由于在时钟块内的信号,output信号默认#0,而且需要经过clk同步,所以在monitor里通过virtual interface获得当前时钟沿的cnt和co比实际的产生晚了一个时钟周期。
clocking block如下:
- clocking cnt_ceil_cb @(posedge clk);
- output cnt,co;
- endclocking
复制代码 可是对于dut一般是不用时钟块连接的。
|
|