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 值,每个值用于乘法运算?

马上就有几个问题:

  1. 在您的模块中,您没有将输入 X 和 W1 分配给 X_reg 和 W1_reg 寄存器。
  2. 您还没有在测试台中声明 X 和 W1 变量。它们被推断为 1 位线,不能像您尝试的那样分配。
  3. 这是风格化的,但您的变量名含糊不清。考虑重命名它们,以便您自己和他人更容易理解您的代码。

您需要在测试台中明确声明信号。

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