我试图弄清楚如何将多个UVC (UVM验证组件)连接到同一个DUT,其中UVC不共享接口,但连接到DUT上的相同信号。
可以在公共信号上操作不同协议并在接收到特定序列后在协议之间切换的DUT。每个协议都被独立开发成自己的UVC,让我们称之为低速和高速。假设接口和DUT如下所示:
interface lowspeed_if( input bit clock, reset );
logic a;
logic b;
logic c;
logic [7:0] io_drv; wire [7:0] io = io_drv;
wire ready;
initial {a,b,c,io_drv} = 'z;
endinterface : lowspeed_if
interface highspeed_if( input bit clock, clk2, reset );
logic a;
logic b_drv; wire b = b_drv;
logic [7:0] io_drv; wire [7:0] io = io_drv;
wire ready;
initial {a,b_drv,io_drv} = 'z;
endinterface : highspeed_if
module device_to_test(input a, inout b, input c, inout [7:0] io, output ready);
/* RTL */
endmodule : device由于UVC的设计没有考虑其他协议,所以低速驱动/监控器只能与lowspeed_if连接,高速驱动/监视器只能与highspeed_if连接。这意味着有两个接口需要连接到相同的a、b、io和ready信号。
是否有一种方法将这些UVC连接到相同的DUT而不更改原始UVC?
发布于 2013-11-07 18:52:04
在顶层,将连接信号定义为电线。对只驱动DUT的信号使用assign语句。双向使用tran .对于仅监视DUT的信号,请使用assign语句
bit clock,clk2,reset;
wire a,b,c;
wire ready;
wire [7:0] io;
lowspeed_if ls_if(.*);
highspeed_if hs_if(.*);
device dut( .* );
assign {a,b,c} = {ls_if.a, ls_if.b, ls_if.c};
tran link_io_ls[7:0](io, ls_if.io);
assign ls_if.ready = ready;
assign a = hs_if.a;
tran link_b_hs(b,hs_if.b);
tran link_io_hs[7:0](io, hs_if.io);
assign hs_if.ready = ready;ready可以与tran连接,因为它在接口中被定义为wire。通过使用assign语句,如果未来的接口将输出定义为wire以外的其他东西,则方向是显式的,并且是灵活的。
我发现assign {a,a} = {ls_if.a,hs_if.a};也适用于分配驱动程序。
发布于 2013-11-07 05:49:19
这是一个好东西,您的接口有wires的工作-这使他们易于捆绑在一起,并有多个驱动程序。您可以创建一个tie模块,该模块将三根电线折叠为一条。
module tie(inout .a(w), .b(w), .c(w));
wire w;
endmodule那么您的测试工作台看起来应该是:
module top;
wire a,b;
wire [7:0] io;
wire clk, clk2, reset, ready
lowspeed_if ls_if(clk, reset);
highspeed_if hs_if(clk,clk2,reset);
tie tie_a(ls_if.a, hs_if.a, a);
tie tie_b(ls_if.b, hs_if.b, b);
tie tie_rdy(ls_if.ready, hs_if.ready, ready);
tie tie_a[7:0](ls_if.io, hs_if.io, io);
device_to_test DUT(a, b, ls_if.c, io, ready);
endmodulehttps://stackoverflow.com/questions/19826342
复制相似问题