首页 > 解决方案 > Verilog HDL 错误:非法的左侧分配

问题描述

我正在学习 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;  

标签: veriloghdl

解决方案


我相信您的问题之一是尝试在 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 块之外,因此它可以保持连线。


推荐阅读