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

时间:2013-11-07 01:31:25

标签: system-verilog uvm

我正在试图找出如何将多个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连接。这意味着有两个接口需要连接到相同的abioready信号。

有没有办法将这些UVC连接到同一个DUT而不改变原来的UVC?

2 个答案:

答案 0 :(得分:1)

在顶层将连接信号定义为导线。对仅驱动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};也适用于分配驱动程序。

答案 1 :(得分:0)

您的界面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);

endmodule