System verilog 在预定义UVC之间共享信号的策略
我试图找出如何将多个UVC(UVM验证组件)连接到同一个DUT,其中UVC不共享接口,但连接到DUT上的相同信号 在接收到特定序列后,可在不同协议上对公共信号进行操作并可在协议之间切换的DUT。每一个协议都独立地发展成为它自己的UVC;让我们称之为低速和高速。假设接口和DUT如下所示:System verilog 在预定义UVC之间共享信号的策略,system-verilog,uvm,System Verilog,Uvm,我试图找出如何将多个UVC(UVM验证组件)连接到同一个DUT,其中UVC不共享接口,但连接到DUT上的相同信号 在接收到特定序列后,可在不同协议上对公共信号进行操作并可在协议之间切换的DUT。每一个协议都独立地发展成为它自己的UVC;让我们称之为低速和高速。假设接口和DUT如下所示: interface lowspeed_if( input bit clock, reset ); logic a; logic b; logic c; logi
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的设计未考虑其他协议,因此低速驱动器/监视器只能在<代码>低速时连接,而高速驱动器/监视器只能在<代码>高速时连接。这意味着有两个接口需要连接到相同的a
、b
、io
和ready
信号
有没有一种方法可以将这些UVC连接到同一DUT而不更改原始UVC 您的接口有
电线可供使用,这是一件好事,这样可以很容易地将它们连接在一起并具有多个驱动程序。您可以创建一个捆扎模块,将三条导线收拢为一条
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);
endmodule
在顶层,将连接信号定义为导线。对仅驱动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
连接,因为它在接口中被定义为导线。使用assign
语句可以明确方向,并且如果将来的接口将输出定义为wire
以外的内容,则该语句是灵活的
我发现assign{a,a}={ls\u if.a,hs\u if.a}
还用于分配驱动程序。两个接口中的一些信号都是逻辑
,因此在连接到模块tie
时会产生错误。只有wire
可以连接到inout
端口。然后,您将不得不使用连续分配而不是连接。例如,如果.ready=ready,可以用assign ls\u替换tie\u rdy;如果准备就绪=准备就绪,则分配hs_代码>只要只有一个驱动程序,即本例中的DUT,它就可以工作。摸索着使用它,我产生了相同的想法,即在驾驶信号上使用assign
。我还决定使用Verilog原语tran
链接双向信号。SystemVerilog关键字别名
还没有太多的工具支持,支持它的工具会给出一个错误,说明接口信号是分层引用。