未解决 net/uwire 不能有多个驱动程序
Unresolved net/uwire cannot have multiple drivers
我在使用以下代码时遇到一些问题:
module register_window(port_A, port_B, PD, CWP, A, B, C, loadRF, clk);
output reg[4:0] port_A;
output reg[4:0] port_B;
input [31:0] PD;
input [1:0] CWP;
input [4:0] A;
input [4:0] B;
input [4:0] C;
input loadRF;
input clk;
reg ld; //enable
wire [3:0] t;
decoder_2x4 decoder2by4(CWP, t, loadRF);
wire [31:0] bitDecoder1;
decoder_5x32 decoder0(C, bitDecoder1, t[0]);
wire [31:0] bitDecoder2;
decoder_5x32 decoder1(C, bitDecoder2, t[1]);
wire[31:0] globalReg0;
assign ld = (bitDecoder1[0] == 32'b0 ||bitDecoder2[0] == 32'b0||bitDecoder3[0] == 32'b0||bitDecoder4[0] == 32'b0);
registers g0(globalReg0, PD, ld, clk);
// G1
wire[31:0] globalReg1;
assign ld = (bitDecoder1[1]== 32'b0||bitDecoder2[1]== 32'b0||bitDecoder3[1]== 32'b0||bitDecoder4[1]== 32'b0);
registers g1(globalReg1, PD, ld, clk);
wire[31:0] globalReg2;
assign ld = (bitDecoder1[2]== 32'b0||bitDecoder2[2]== 32'b0||bitDecoder3[2]== 32'b0||bitDecoder4[2]== 32'b0);
registers g2(globalReg2, PD, ld, clk);
基本上我的代码试图做的是将 wire t
设置为二进制解码器的输出以及其他 5x32 解码器的输入(此处省略了一些)。然后,根据解码器的值,它为 ld 分配一个值,该值基本上只是一个启用信号(如果任何解码器位为 1,则启用为 1,否则为 0)。然后这些值进入寄存器,并通过电线(globalReg1
、globalReg2
等)输出。如果重要的话,他们都使用相同的时钟。
我得到的编译错误是
testbench.sv:37: error: Unresolved net/uwire ld cannot have multiple drivers.
在分配的每一行中; assign ld = (bitDecoder1[1]== 32'b0||bitDecoder2[1]== 32'b0||bitDecoder3[1]== 32'b0||bitDecoder4[1]== 32'b0);
我也尝试将上面的行放在 always @(*) begin
和 end
语句之间(因为我认为你总是必须在代码的逻辑部分之间这样做)但是那只会给我一个错误:
testbench.sv:33: error: ld Unable to assign to unresolved wires.
如果有人能给我指出正确的方向,我将永远感激不已。谢谢!
首先:assign的目标必须是wire,而不是reg。
其次,我找不到 bitDecoder1 或 bitDecoder2 的任何定义。
顾名思义,它们是位,但您是将它们与 32 位进行比较。这让我有些困惑,但这对你的问题来说并不重要。
... ld which is basically just an enable signal (if any of the decoder bits are 1, the enable is 1 otherwise, 0).
我无法将其与您的代码相匹配。那里有三个寄存器(g0、g1、g2,每个都需要一个负载使能。因此你需要一个 ld0、ld1、ld2。
Verilog 不像 C,您可以多次重复使用一个变量。
请记住,它是一种大型并行语言:任何文件中各处的所有赋值都是同时执行的。
如果 12 个比较匹配中的 any 匹配,则您希望加载 g0、g1、g2 的 all。在这种情况下,您仍然需要一个 ld0 ld1 和 ld2,但您需要将它们与 OR 函数组合:
assign ld = l0 | ld1 | ld2;
我在使用以下代码时遇到一些问题:
module register_window(port_A, port_B, PD, CWP, A, B, C, loadRF, clk);
output reg[4:0] port_A;
output reg[4:0] port_B;
input [31:0] PD;
input [1:0] CWP;
input [4:0] A;
input [4:0] B;
input [4:0] C;
input loadRF;
input clk;
reg ld; //enable
wire [3:0] t;
decoder_2x4 decoder2by4(CWP, t, loadRF);
wire [31:0] bitDecoder1;
decoder_5x32 decoder0(C, bitDecoder1, t[0]);
wire [31:0] bitDecoder2;
decoder_5x32 decoder1(C, bitDecoder2, t[1]);
wire[31:0] globalReg0;
assign ld = (bitDecoder1[0] == 32'b0 ||bitDecoder2[0] == 32'b0||bitDecoder3[0] == 32'b0||bitDecoder4[0] == 32'b0);
registers g0(globalReg0, PD, ld, clk);
// G1
wire[31:0] globalReg1;
assign ld = (bitDecoder1[1]== 32'b0||bitDecoder2[1]== 32'b0||bitDecoder3[1]== 32'b0||bitDecoder4[1]== 32'b0);
registers g1(globalReg1, PD, ld, clk);
wire[31:0] globalReg2;
assign ld = (bitDecoder1[2]== 32'b0||bitDecoder2[2]== 32'b0||bitDecoder3[2]== 32'b0||bitDecoder4[2]== 32'b0);
registers g2(globalReg2, PD, ld, clk);
基本上我的代码试图做的是将 wire t
设置为二进制解码器的输出以及其他 5x32 解码器的输入(此处省略了一些)。然后,根据解码器的值,它为 ld 分配一个值,该值基本上只是一个启用信号(如果任何解码器位为 1,则启用为 1,否则为 0)。然后这些值进入寄存器,并通过电线(globalReg1
、globalReg2
等)输出。如果重要的话,他们都使用相同的时钟。
我得到的编译错误是
testbench.sv:37: error: Unresolved net/uwire ld cannot have multiple drivers.
在分配的每一行中; assign ld = (bitDecoder1[1]== 32'b0||bitDecoder2[1]== 32'b0||bitDecoder3[1]== 32'b0||bitDecoder4[1]== 32'b0);
我也尝试将上面的行放在 always @(*) begin
和 end
语句之间(因为我认为你总是必须在代码的逻辑部分之间这样做)但是那只会给我一个错误:
testbench.sv:33: error: ld Unable to assign to unresolved wires.
如果有人能给我指出正确的方向,我将永远感激不已。谢谢!
首先:assign的目标必须是wire,而不是reg。
其次,我找不到 bitDecoder1 或 bitDecoder2 的任何定义。
顾名思义,它们是位,但您是将它们与 32 位进行比较。这让我有些困惑,但这对你的问题来说并不重要。
... ld which is basically just an enable signal (if any of the decoder bits are 1, the enable is 1 otherwise, 0).
我无法将其与您的代码相匹配。那里有三个寄存器(g0、g1、g2,每个都需要一个负载使能。因此你需要一个 ld0、ld1、ld2。
Verilog 不像 C,您可以多次重复使用一个变量。
请记住,它是一种大型并行语言:任何文件中各处的所有赋值都是同时执行的。
如果 12 个比较匹配中的 any 匹配,则您希望加载 g0、g1、g2 的 all。在这种情况下,您仍然需要一个 ld0 ld1 和 ld2,但您需要将它们与 OR 函数组合:
assign ld = l0 | ld1 | ld2;