Verilog 错误:通过端口连接驱动,是多重驱动

Verilog 错误:通过端口连接驱动,是多重驱动,verilog,system-verilog,Verilog,System Verilog,我能够在modelsim中构建代码,但当模拟出现以下错误时: addr_x,通过端口连接驱动,是多路驱动(44)线路:49 addr\u f,通过端口连接驱动,是多路驱动(46)线路:49 s_ready_x,通过端口连接驱动,是多路驱动(44)线路:49 s_ready_f,通过端口连接驱动,是多路驱动(46)线路:49 我如何解决这个问题?(system verilog)没有简单的*修复方法:您必须更改您的设计。您甚至可能不得不“回到绘图板”,从根本上改变您的设计 在每个ctrlpath..

我能够在modelsim中构建代码,但当模拟出现以下错误时:

  • addr_x,通过端口连接驱动,是多路驱动(44)线路:49
  • addr\u f,通过端口连接驱动,是多路驱动(46)线路:49
  • s_ready_x,通过端口连接驱动,是多路驱动(44)线路:49
  • s_ready_f,通过端口连接驱动,是多路驱动(46)线路:49
  • 我如何解决这个问题?(system verilog)

    没有简单的*修复方法:您必须更改您的设计。您甚至可能不得不“回到绘图板”,从根本上改变您的设计

    在每个
    ctrlpath..
    模块中,输出一个地址。因此,您从不同的输出驱动相同的网络。你必须区分哪些是你真正需要的。因此,您需要添加一个多路复用器,该复用器“知道”要选择哪个

    “多重驱动”错误是堆栈溢出和电气工程中经常出现的问题。您所做的是将多个输出端口连接在一起。在电气工程中,我们称之为“一起短路输出”。术语短路很重要,因为它实际上是一种短路。这是等效电路:

    一些输出将是高的,而另一些则是低的。高电平将尝试驱动输出高电平,打开从VCC到输出引脚的电流路径。低的将尝试驱动低输出。它们打开了从输出到接地的电流通路。它们一起在VCC和接地之间形成短路


    *不要认为使用三态驱动程序可以轻松解决此问题。理论上这似乎是可能的,实际上你真的,真的不想那样

    以下是来自VCS编译的消息之一:

    错误-[ICSD]驱动程序的非法组合 design.sv,38 结构驱动程序的非法组合。 变量“s_ready_x”由多个结构驱动程序驱动。 此变量在 “design.sv”,38:逻辑s_ready_x; 第一个驱动程序位于“design.sv”,50:ctrlpathoc(.clk(clk),.reset (重置),.wr_done_f(wr_done_f),.wr_done_x(wr_done_x),.addr_x (地址x),.addr\u f(地址f),.m\u valid\u y(地址y),.c。。。 第二个驱动程序位于“design.sv”,45:ctrlpathx(.clk(clk),.reset (重置),.s_ready_x(s_ready_x),.addr_x(addr_x),.wr_done_x (wr_done_x),.wr_en_x(wr_en_x),.s_valid_x(s_valid_x))

    它只是将问题传播到顶级模块,但给出了驱动程序的正确位置

    问题是,
    ctrlpathf
    ctrlpatho
    都使用
    output
    端口驱动相同的信号。经验法则是:

    不能使用多个驱动程序驱动同一变量

    System verilog只是将此要求添加到标准中,并检查特定的System verilog块

    修理它

  • 你需要复习你的课程,以防你犯了错误

  • verilog允许您对驱动器
    net
    类型进行倍增,并为结果定义规则。如果您真的想拥有多个驱动程序,则需要将这些端口声明为
    wires
    或类似端口,并更改代码以反映它。它们可以通过
    assign
    语句进行倍增驱动