我正在试图找出如何将多个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?
答案 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