Verilog HDL error: Illegal left-hand side assignment
Verilog HDL error: Illegal left-hand side assignment
我正在学习 CPU 设计和基本的 Verilog HDL。我在 Fedora 29 的 tkgate 中有一个处理器 运行,我设计了一个硬件 RAM 磁盘。我无法测试 RAM,但决定用 HDL RAM 磁盘替换它。每当我尝试模拟电路时,我都会收到错误消息:
RAM_HDL,第 17 行:在左侧赋值中非法使用 'w7'。
这是我的 RAM 代码:
module RAM_HDL(RAM, Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
wire [15:0] Data_In;
wire [15:0] Data_Out;
wire [7:0] Address;
wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
Data_Out <= Address;
end
endmodule
错误在第 17 行:
Data_Out <= Address;
我认为您遇到的一个问题是试图在 always 块中分配一种电线类型。尝试将 Data_Out 的声明更改为 reg 而不是 wire。为我编译了以下 2 个示例:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input wire [15:0] Data_In;
output reg [15:0] Data_Out;
input wire [7:0] Address;
input wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
Data_Out <= Address;
end
endmodule
注意变化。输入和输出在端口上声明。 ram 阵列不是端口之一,data_out 是一个 reg.
另一种选择是将数据分配移到 always 块之外,并将其保留为连线:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input wire [15:0] Data_In;
output wire [15:0] Data_Out;
input wire [7:0] Address;
input wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
end
assign Data_Out = Address;
endmodule
变化大体相同。输入输出声明和 ram 数组从端口列表中删除。 Data_Out 但是现在分配在 always 块之外,因此它可以保持连线。
至少编译以下代码:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input [15:0] Data_In;
output [15:0] Data_Out;
input [7:0] Address;
input RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
end
assign Data_Out = RAM[Address];
endmodule
我正在学习 CPU 设计和基本的 Verilog HDL。我在 Fedora 29 的 tkgate 中有一个处理器 运行,我设计了一个硬件 RAM 磁盘。我无法测试 RAM,但决定用 HDL RAM 磁盘替换它。每当我尝试模拟电路时,我都会收到错误消息:
RAM_HDL,第 17 行:在左侧赋值中非法使用 'w7'。
这是我的 RAM 代码:
module RAM_HDL(RAM, Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
wire [15:0] Data_In;
wire [15:0] Data_Out;
wire [7:0] Address;
wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
Data_Out <= Address;
end
endmodule
错误在第 17 行:
Data_Out <= Address;
我认为您遇到的一个问题是试图在 always 块中分配一种电线类型。尝试将 Data_Out 的声明更改为 reg 而不是 wire。为我编译了以下 2 个示例:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input wire [15:0] Data_In;
output reg [15:0] Data_Out;
input wire [7:0] Address;
input wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
Data_Out <= Address;
end
endmodule
注意变化。输入和输出在端口上声明。 ram 阵列不是端口之一,data_out 是一个 reg.
另一种选择是将数据分配移到 always 块之外,并将其保留为连线:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input wire [15:0] Data_In;
output wire [15:0] Data_Out;
input wire [7:0] Address;
input wire RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
end
assign Data_Out = Address;
endmodule
变化大体相同。输入输出声明和 ram 数组从端口列表中删除。 Data_Out 但是现在分配在 always 块之外,因此它可以保持连线。
至少编译以下代码:
module RAM_HDL(Data_In, Data_Out, Address, RW);
reg [15:0] RAM [127:0];
input [15:0] Data_In;
output [15:0] Data_Out;
input [7:0] Address;
input RW;
initial
$readmemb("RAM_DATA.BIN", RAM);
always @(*)
begin
if (RW)
RAM[Address] <= Data_In;
end
assign Data_Out = RAM[Address];
endmodule