未解析的net / uwire不能有多个驱动程序

时间:2018-01-11 15:12:35

标签: verilog system-verilog microprocessors icarus

我在使用以下代码时遇到了一些问题:

wire t

基本上我的代码尝试将globalReg1设置为二进制解码器的输出以及其他5x32解码器的输入(这里省略了一些)。然后,根据解码器的值,它将值分配给ld,这基本上只是一个使能信号(如果任何解码器位为1,则启用为1,否则为0)。然后这些值进入寄存器,并由电线(globalReg2assign ld = (bitDecoder1[1]== 32'b0||bitDecoder2[1]== 32'b0||bitDecoder3[1]== 32'b0||bitDecoder4[1]== 32'b0);等)输出。如果重要的话,它们都使用相同的时钟。

我得到的编译错误是

  

testbench.sv:37:错误:未解析的net / uwire ld不能有多个驱动程序。

在每一行中; always @(*) begin

我也尝试在end和{{1}}语句之间添加上述行(因为我认为你总是必须在代码的逻辑部分之间做到这一点)但是那只是给我一个错误:< / p>

  

testbench.sv:33:错误:ld无法分配给未解析的电线。

如果有人能指出我正确的方向,我会永远感激。谢谢!

1 个答案:

答案 0 :(得分:1)

首先:分配的目标必须是电线,而不是注册。

其次我找不到bitDecoder1或bitDecoder2的任何定义 这个名字表明它们是位,但是你将它们与32位进行比较。这让我感到困惑,但这对你的问题并不重要。

  

... ld基本上只是一个使能信号(如果任何解码器位为1,则使能为1,否则为0)。

我无法将其与您的代码相匹配。那里有三个寄存器(g0,g1,g2,每个都需要一个负载使能。因此你需要一个ld0,ld1,ld2。
Verilog不像C,你可以多次重复使用变量。 请记住它是一种大规模的并行语言:任何文件中的所有分配都是同时执行的。

如果12的任何比较匹配,则需要全部加载g0,g1,g2。在这种情况下,你仍然需要一个ld0 ld1和ld2,但你需要将它们与OR函数结合起来:

assign ld = l0 | ld1 | ld2;