Verilog HDL error: незаконное левостороннее назначение - PullRequest
0 голосов
/ 27 февраля 2019

Я изучаю дизайн процессора и основы Verilog HDL.У меня есть процессор, работающий в tkgate на Fedora 29, и я разработал аппаратный 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;  

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Следующий код компилируется как минимум:

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 голосов
/ 28 февраля 2019

Я полагаю, что одной из ваших проблем является попытка назначить тип провода в блоке всегда.Попробуйте изменить объявление 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  

обратите внимание на изменения.вход и выход объявлены на портах.Массив оперативной памяти не является одним из портов, а data_out является регистром

. Другой вариант - переместить назначение данных за пределы блока 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  

изменения в основном одинаковые.объявления ввода-вывода и массив оперативной памяти удаляются из списка портов.Однако Data_Out теперь назначается вне блока Always, поэтому он может оставаться на связи.

...