我正在学习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;
答案 0 :(得分:3)
我相信您的问题之一是试图在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块之外,以便它可以保持连接。
答案 1 :(得分:0)
以下代码至少可以编译:
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