我正在学习CPU设计和基本Verilog。我有一个处理器运行在Fedora 29上的tkgate,我设计了一个硬件RAM磁盘。我不能测试RAM,但已经决定用HDL磁盘代替它。每当我试图模拟电路时,我就会得到错误:
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; 发布于 2019-02-28 01:08:39
以下代码至少会编译:
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发布于 2019-02-27 21:54:09
我相信你的问题之一是试图分配一个线型在一个始终块。尝试将Data_Out的声明更改为reg而不是连线。为我编写的以下两个例子:
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。
另一种选择是将数据分配移出始终块之外,并将其保持为一条线路:
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现在被分配到始终块之外,这样它就可以保持一条线路。
https://stackoverflow.com/questions/54914034
复制相似问题