System verilog 在预定义UVC之间共享信号的策略

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

我试图找出如何将多个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的设计未考虑其他协议,因此低速驱动器/监视器只能在<代码>低速时连接,而高速驱动器/监视器只能在<代码>高速时连接。这意味着有两个接口需要连接到相同的
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关键字
别名
还没有太多的工具支持,支持它的工具会给出一个错误,说明接口信号是分层引用。