【问题标题】:Multidriven nets: Synthesis ok, Simulation fails多驱动网络:合成正常,模拟失败
【发布时间】:2018-08-21 06:53:20
【问题描述】:

我对 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

【问题讨论】:

    标签: simulation fpga system-verilog bus


    【解决方案1】:

    我假设您希望 data 的值向 top 模块发出信号,该模块由驱动程序模块的两个输出驱动(例如,当一个驱动器 'z 时,另一个得到巴士。

    如果您将top.data 信号声明为output wire logic [1:0] data,就会发生这种情况。

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

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

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

    【讨论】:

    • 感谢您的精彩回答!当通过非阻塞分配分配数据时(每个驱动程序都有其单独的 always_ff 块,并且非活动再次将其值设置为 'z),是否会有解决方案,因为这样就无法使用电线或?
    • @ES_major 我认为电线只能由assign 语句驱动,所以这是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    相关资源
    最近更新 更多