Почему iverilog жалуется на мой модуль testbench? - PullRequest
0 голосов
/ 08 марта 2019

Я пишу модуль verilog для моего класса CompSci, и этот модуль специально является модулем памяти данных. Структурно и аналитически, я смотрю на это, и оно должно работать на основе других файлов, которые у меня есть, но я не уверен, почему этот файл работает и дает мне все икс. Надеясь на свежий взгляд, можно найти ошибку, которую я пропустил. Заранее спасибо.

datamem.v:

module datamem(Ina, Inb, enable, readwrite, dataOut, clk, rst);

input wire [31:0] Ina;
input wire [31:0] Inb;
input wire enable;
input wire readwrite;
input wire clk;
input wire rst;

reg [31:0] memory[0:65535];
output reg [31:0] dataOut;

always @(memory[Ina]) begin
        dataOut = memory[Ina];
    end

always @(posedge clk) begin
    if(1'b1 == readwrite) begin
        memory[Ina] = Inb;
    end
end

endmodule

datamem_tb.v:

module datamem_tb();

reg [31:0] Ina;
reg [31:0] Inb;
reg enable;
reg readwrite;
reg clk;
reg rst;

wire [31:0] dataOut;

datamem DUT (Ina, Inb, enable, readwrite, dataOut, clk, rst);

initial
begin

    Ina <= 32'd0;
    Inb <= 32'd0;
    enable <= 0;
    readwrite <= 0;

    #20 Ina <= 32'd1234;
    #20 Inb <= 32'd1234;
    #20 Ina <= 32'd0517;
    #20 Inb <= 32'd10259;

end

always @(Ina or Inb)
    #1 $display("| Ina = %d | Inb = %d | dataOut = %d |", Ina, Inb, dataOut);

endmodule

1 Ответ

1 голос
/ 08 марта 2019

Несколько вещей о том, почему вы получаете все 'x:

  1. Вы никогда не запускаете часы, вам нужно добавить что-то вроде следующего, чтобы переключить часы:
     initial begin
       clk = 1'b0;
       forever #5 clk = ~clk;
     end
Вы никогда не утверждаете readwrite, что требуется для записи в ваш модуль памяти (вы устанавливаете его в 0 в строке 20 и никогда не меняете его).Без записи в memory будет сохранено исходное значение 'x для каждого элемента

Помимо этого, есть несколько других проблем с вашим модулем:

  1. Используйте неявные конфиденциальные списки (вместо always @(memory[inA]) используйте always @(*))
  2. Используйте неблокирующее назначение для записи в память (memory[inA] <= inB)
  3. Рассмотрите возможность использования $monitor вместо$display для ваших операторов печати, чтобы избежать проблем с синхронизацией, и вам нужно вызывать его только в начале вашего initial блока в вашей тестовой среде (http://referencedesigner.com/tutorials/verilog/verilog_09.php)
  4. Ваши rst и enable не подключенык чему-либо.

Другой пример реализации блока памяти можно найти здесь: Блок памяти данных

...