问题描述
我的 UVM 测试台中有一个接口,它由多个 nmos 实例组成。模拟器(modelsim)对此表示抱怨,因为它违反了 LRM(在接口内部不能有接口以外的任何东西的实例化)。我需要将实例移到界面之外。
我该怎么做?可以通过 modport 或任务完成吗?这是我没有编写的遗留代码。
interface model_interface(input wire mac_clk,input reset);
wire [31:0] modelio_vi;
wire [31:0] modelio_data_in;
wire [31:0] modelio_data_out;
wire [31:0] modelio_data_oen;
logic [4:0] modelio_mode_if [32];
logic [4:0] ulp_modelio_mode_if [32];
logic sample_if [32];
bit ulp_modelio_mux_en;
bit host_disable;
genvar loop;
//The below block is the issue
generate
for(loop=0; loop<32; loop=loop+1)
begin:asgn
nmos inst_1(modelio_vi[loop],modelio_data_in[loop],(~modelio_data_oen[loop]));//TB to DUT Buffer
nmos inst_2(modelio_data_out[loop],modelio_vi[loop],( modelio_data_oen[loop]));//DUT to TB Buffer
end
endgenerate
endinterface
解决方法
nmos
必须在模块内实例化,因为它是一个 Verilog 开关原语。
nmos (out,in,ctrl);
在功能上与 assign out = ctrl ? in : 'z;
相同,因此您可以切换到使用 assign 语句来最小化代码更改。否则,您必须将 nmos
移动到一个单独的模块中并分配连接共享信号。
generate
for(loop=0; loop<32; loop=loop+1)
begin:asgn
assign modelio_vi[loop] = !modelio_data_oen[loop] ? modelio_data_in[loop] : 'z;//TB to DUT Buffer
assign modelio_data_out[loop] = modelio_data_oen[loop] ? modelio_vi[loop] : 'z;//DUT to TB Buffer
end
endgenerate