多驱动网:综合正常,模拟失败

时间:2018-08-21 06:53:20

标签: simulation fpga system-verilog bus

我对System Verilog有一个基本的理解问题。我正在进行处理器设计,其中一些总线系统应在多个处理单元(系统Verilog模块)之间共享。使用仲裁器时,一次只能激活一个模块来驱动总线,而其他所有模块都处于高阻抗状态。

在综合过程中,我摆脱了Vivado中的多驱动网络警告,并且不再存在任何总线冲突,但是模拟器给出了警告,即总线信号“可能”是多驱动的。我做了一个很小的示例代码,当'select'是'10'时,我希望得到'data''11'?

在Vivado中停止仿真时,它可以与Cadence模拟器一起使用,但是结果不正确-screenshot simulation

testbench.sv

`timescale 1ns / 1ps
module testbench_top();

logic [1:0] select;
logic [1:0] data;

top top_inst(.*);

initial
begin
  select = 0;
  #2 select = 1;
  #2 select = 2;
  #2 select = 0;;
end
  initial
    begin
      $monitor("t=%3d s=%b,d=%b\n",$time,select,data);
    end
endmodule

design.sv

`timescale 1ns / 1ps
module top
(
 input logic [1:0] select,
 output logic [1:0] data 
);

driver_1 driver_1_inst(.*);
driver_2 driver_2_inst(.*);

endmodule



module driver_1
(
 input logic [1:0] select,
 output logic [1:0] data 
);
always_comb
begin
  if (select == 2'b10)
        data = 2'b11;
    else
        data = 'z;
end
endmodule



module driver_2
(
 input logic [1:0] select,
 output logic [1:0] data 
);
always_comb
begin
  if (select == 2'b01)
        data = 2'b01;
    else
        data = 'z;
end
endmodule

1 个答案:

答案 0 :(得分:0)

我假设您希望data信号的值top由驱动程序模块的两个输出来驱动,例如,当一个驱动器{{1} },其他人上车了。

如果您将'z信号声明为top.data,就会发生这种情况。

23.2.2.3节确定IEEE 1800-2012标准的端口类型,数据类型和方向的规则指出

  

对于输出端口,默认端口类型取决于数据类型   指定:—如果数据类型被省略或用   隐式数据类型语法,端口种类应默认为   默认网络类型。 —如果数据类型是用显式声明的   data_type语法,端口种类应默认为变量。

在您的情况下,由于您将output wire logic [1:0] data声明为data,因此适用第二个子句,这意味着它被解释为变量而不是网络。无法解析变量的多个值(在某些工具中也是非法的)。