首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Verilog HDL错误:非法的左侧分配

Verilog HDL错误:非法的左侧分配
EN

Stack Overflow用户
提问于 2019-02-27 20:33:47
回答 2查看 1K关注 0票数 0

我正在学习CPU设计和基本Verilog。我有一个处理器运行在Fedora 29上的tkgate,我设计了一个硬件RAM磁盘。我不能测试RAM,但已经决定用HDL磁盘代替它。每当我试图模拟电路时,我就会得到错误:

RAM_HDL,第17行:在左侧分配中非法使用“w7”.

下面是我的RAM代码:

代码语言:javascript
复制
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行:

代码语言:javascript
复制
Data_Out <= Address;  
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-28 01:08:39

以下代码至少会编译:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-02-27 21:54:09

我相信你的问题之一是试图分配一个线型在一个始终块。尝试将Data_Out的声明更改为reg而不是连线。为我编写的以下两个例子:

代码语言:javascript
复制
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。

另一种选择是将数据分配移出始终块之外,并将其保持为一条线路:

代码语言:javascript
复制
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现在被分配到始终块之外,这样它就可以保持一条线路。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54914034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档