【问题标题】:Verilog HDL error: Illegal left-hand side assignmentVerilog HDL 错误:非法的左侧分配
【发布时间】:2019-02-27 20:33:47
【问题描述】:

我正在学习 CPU 设计和基本的 Verilog HDL。我有一个在 Fedora 29 上的 tkgate 中运行的处理器,并且我设计了一个硬件 RAM 磁盘。我无法测试 RAM,但决定用 HDL RAM 磁盘替换它。每当我尝试模拟电路时,都会收到错误消息:
RAM_HDL, line 17: Illegal use of 'w7' in left-hand-side assignment。
这是我的 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;  

【问题讨论】:

标签: verilog hdl


【解决方案1】:

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

【讨论】:

  • 我将 Data_Out 变量从 wire 更改为 reg。我现在收到以下错误:主板:端口 Data_Out 上使用的类型声明无效
  • 进一步添加了适合线/注册定义的输入/输出。所以我的代码/语法和你的一样。现在得到错误: Line2: Syntax error.
  • @JohntheAlmost-Genius 我刚刚编辑了答案,希望能解决这些问题。如果 reg 由于某种原因不起作用,请提供替代选项。
  • 更多错误出现在第 3、14、15 和 18 行。所有报告语法错误。
  • 第二个例子的第 4、6、15 和 16 行。
【解决方案2】:

以下代码至少可以编译:

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

【讨论】:

  • 你不是说Data_Out = RAM[Address]吗? RAM 中不返回它存储的数据有什么意义:)
  • 我做到了,对不起。我的编辑器中没有复制和粘贴功能,所以我不得不用肉眼复制。编辑反映。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2020-08-02
  • 2017-12-30
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
相关资源
最近更新 更多