![](/img/trans.png)
[英]Verilog error: Register is illegal in left-hand side of continuous 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.