Why am I getting the error : part select cannot be applied to scalar in my testbench?
Why am I getting the error : part select cannot be applied to scalar in my testbench?
我设计了一个乘法电路,它有两个 32-b 输入,将被分成两个 16-b 值并分别相乘,然后将结果加在一起。这是逻辑的一部分:
parameter WordLen1 = 32, WordLen2 = 16;
output [WordLen2-1:0] M;
input clk;
input signed [WordLen1-1:0] X, W1;
reg signed [WordLen1-1 :0] X_reg, W1_reg, M;
wire signed [WordLen2-1:0] mul1, mul2, M_out;
assign mul1 = X_reg[31:16] * W1_reg[31:16];
assign mul2 = X_reg[15:0] * W1_reg[15:0];
assign M_out = mul1 + mul2;
代码的测试台如下:
module testbench;
reg clk;
parameter WL1 = 32, WL2 = 16;
reg [WL1-1:0] Xinarray [0:1]; // define memory arrays to hold inputs
reg [WL1-1:0] W1inarray [0:1];
wire [WL2-1:0] M;
integer i;
mult_hidden uut(M,clk,X,W1);
initial begin
$readmemb("input.txt", Xinarray); // read values into arrays from files
$readmemb("weight1.txt", W1inarray);
$display("Starting...");
for (i=0; i<=1; i=i+1) // loop through all values in the memories
begin
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
W1[31:0] = W1inarray[i];
$display("...Done");
$finish;
end
end
always #1 clk = !clk;
endmodule
每个输入文件都有 32 位二进制数。在编译代码时,我收到以下错误消息:
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
|
ncvlog: *E,WANOTL (../src/mult_hidden_tb.v,21|1): A net is not a legal lvalue in this context [9.3.1(IEEE)].
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
|
ncvlog: *E,NOPSOS (../src/mult_hidden_tb.v,21|1): Part-select operator cannot be applied to scalar [4.2.1(IEEE)].
W1[31:0] = W1inarray[i];
|
ncvlog: *E,WANOTL (../src/mult_hidden_tb.v,22|2): A net is not a legal lvalue in this context [9.3.1(IEEE)].
W1[31:0] = W1inarray[i];
|
ncvlog: *E,NOPSOS (../src/mult_hidden_tb.v,22|2): Part-select operator cannot be applied to scalar [4.2.1(IEEE)].
make: *** [mult_hidden] Error 1
我需要如何修改我的测试平台,以便读取输入文本文件并将 32-b 输入拆分为 16-b 值,每个值用于乘法运算?
马上就有几个问题:
- 在您的模块中,您没有将输入 X 和 W1 分配给 X_reg 和 W1_reg 寄存器。
- 您还没有在测试台中声明 X 和 W1 变量。它们被推断为 1 位线,不能像您尝试的那样分配。
- 这是风格化的,但您的变量名含糊不清。考虑重命名它们,以便您自己和他人更容易理解您的代码。
您需要在测试台中明确声明信号。
Verilog 将 X
隐式声明为 1 位网络(类似于 wire
)。但是,您需要它是不同的类型和位宽。 W1
也是如此。
将此行添加到您的测试台会清除所有编译错误消息:
logic signed [WL1-1:0] X, W1;
与 wire
不同,logic
允许程序分配(在 initial
块中)。
将此行放在测试台的顶部。例如:
module testbench;
reg clk;
parameter WL1 = 32, WL2 = 16;
reg [WL1-1:0] Xinarray [0:1]; // define memory arrays to hold inputs
reg [WL1-1:0] W1inarray [0:1];
logic signed [WL1-1:0] X, W1; // <------- Here
我设计了一个乘法电路,它有两个 32-b 输入,将被分成两个 16-b 值并分别相乘,然后将结果加在一起。这是逻辑的一部分:
parameter WordLen1 = 32, WordLen2 = 16;
output [WordLen2-1:0] M;
input clk;
input signed [WordLen1-1:0] X, W1;
reg signed [WordLen1-1 :0] X_reg, W1_reg, M;
wire signed [WordLen2-1:0] mul1, mul2, M_out;
assign mul1 = X_reg[31:16] * W1_reg[31:16];
assign mul2 = X_reg[15:0] * W1_reg[15:0];
assign M_out = mul1 + mul2;
代码的测试台如下:
module testbench;
reg clk;
parameter WL1 = 32, WL2 = 16;
reg [WL1-1:0] Xinarray [0:1]; // define memory arrays to hold inputs
reg [WL1-1:0] W1inarray [0:1];
wire [WL2-1:0] M;
integer i;
mult_hidden uut(M,clk,X,W1);
initial begin
$readmemb("input.txt", Xinarray); // read values into arrays from files
$readmemb("weight1.txt", W1inarray);
$display("Starting...");
for (i=0; i<=1; i=i+1) // loop through all values in the memories
begin
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
W1[31:0] = W1inarray[i];
$display("...Done");
$finish;
end
end
always #1 clk = !clk;
endmodule
每个输入文件都有 32 位二进制数。在编译代码时,我收到以下错误消息:
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
|
ncvlog: *E,WANOTL (../src/mult_hidden_tb.v,21|1): A net is not a legal lvalue in this context [9.3.1(IEEE)].
X[31:0] = Xinarray[i]; // set the inputs from the memory arrays
|
ncvlog: *E,NOPSOS (../src/mult_hidden_tb.v,21|1): Part-select operator cannot be applied to scalar [4.2.1(IEEE)].
W1[31:0] = W1inarray[i];
|
ncvlog: *E,WANOTL (../src/mult_hidden_tb.v,22|2): A net is not a legal lvalue in this context [9.3.1(IEEE)].
W1[31:0] = W1inarray[i];
|
ncvlog: *E,NOPSOS (../src/mult_hidden_tb.v,22|2): Part-select operator cannot be applied to scalar [4.2.1(IEEE)].
make: *** [mult_hidden] Error 1
我需要如何修改我的测试平台,以便读取输入文本文件并将 32-b 输入拆分为 16-b 值,每个值用于乘法运算?
马上就有几个问题:
- 在您的模块中,您没有将输入 X 和 W1 分配给 X_reg 和 W1_reg 寄存器。
- 您还没有在测试台中声明 X 和 W1 变量。它们被推断为 1 位线,不能像您尝试的那样分配。
- 这是风格化的,但您的变量名含糊不清。考虑重命名它们,以便您自己和他人更容易理解您的代码。
您需要在测试台中明确声明信号。
Verilog 将 X
隐式声明为 1 位网络(类似于 wire
)。但是,您需要它是不同的类型和位宽。 W1
也是如此。
将此行添加到您的测试台会清除所有编译错误消息:
logic signed [WL1-1:0] X, W1;
与 wire
不同,logic
允许程序分配(在 initial
块中)。
将此行放在测试台的顶部。例如:
module testbench;
reg clk;
parameter WL1 = 32, WL2 = 16;
reg [WL1-1:0] Xinarray [0:1]; // define memory arrays to hold inputs
reg [WL1-1:0] W1inarray [0:1];
logic signed [WL1-1:0] X, W1; // <------- Here