Тестовый стенд с самопроверкой Verilog не запускается? Создание простого ALU, это не должно быть так сложно

Мне поручено построить ALU. Однако я не должен понимать, как должен работать тестовый стенд. Я отлично запускал другие простые тестовые стенды.

  1. код компилируется (используя quartus)
  2. сделал текстовый файл и превратил его в файл test.tv
  3. открыл modelsim и добавил файл
  4. когда я запускаю его, возникает проблема с портами y и zero.

Вот мой код:

module ALU(input [31:0] a,b,
input [2:0] f,
output reg [31:0] y ,
output reg zero);

always @(*) begin

    case(f)
      3'b000: y = a & b;  
      3'b001: y = a | b;  
      3'b010: y = a + b;    
      3'b011: y = 32'b0;    
      3'b100: y = a & ~b;
      3'b101: y = a | ~b;
      3'b110: y = a - b;
      3'b111: y = a < b;
     default: y = 32'b0;
  endcase
if(y==0)
    zero=1'b1;
else
    zero=1'b0;
end 
endmodule

//**********************

module testALU();
 reg clk;
 reg [31:0]a, b, yexpected;
 reg [2:0]f;
 reg [31:0]y; 
 reg zeroexpected;
 reg zero;
 reg[31:0] vectornum, errors;
 reg [100:0] testvectors[10000:0];

 ALU dut(a,b,f,yexpected,zeroexpected);

always
begin
    clk = 1; #5; clk = 0; #5;
end

initial
begin
    $readmemb("test.tv", testvectors);
    vectornum = 0; errors = 0;
end

always @(posedge clk)
begin
#1; {a,b,f,yexpected,zeroexpected} = testvectors[vectornum];
end

always @(negedge clk)
begin
if (y !== yexpected) begin
$display("Error: inputs = %b", {a,b,f});
$display(" outputs = %b (%b expected)", y, yexpected);
errors = errors + 1;
end

vectornum = vectornum + 1;
if (testvectors[vectornum] === 100'bx) begin
    $display("%d tests completed with %d errors", vectorum, errors);
    $stop;
 end
 end
endmodule   

//*************************************

ОШИБКА:

** Ошибка: **(vsim-3043) Неразрешенная ссылка на векторум. Время: 0 пс Итерация: 0 Экземпляр: /testALU Файл: C:/Users/prest/Desktop/Hardware Design/ALU/testALU.v Строка: 40

** Ошибка ** (подавляемая): (vsim-3053) Недопустимое соединение выходного или входящего порта для порта «y». Время: 0 пс Итерация: 0 Экземпляр: /testALU/dut Файл: C:/Users/prest/Desktop/Hardware Design/ALU/testALU.v Строка: 11

** Ошибка ** (подавляемая): (vsim-3053) Недопустимое соединение выходного или входящего порта для порта «ноль». Время: 0 пс Итерация: 0 Экземпляр: /testALU/dut Файл: C:/Users/prest/Desktop/Hardware Design/ALU/testALU.v Строка: 11

Вот как мой файл test.tv выглядит в двоичном формате

> 00000000000000000000000000000000_00000000000000000000000000000000_010_00000000000000000000000000000000_1
> 00000000000000000000000000000000_11111111111111111111111111111111_010_11111111111111111111111111111111_0
> 00000000000000000000000000000000_01010101010101010101010101010101_010_01010101010101010101010101010101_0

Я знаю, что это может показаться глупым и простым, но я действительно пытаюсь этому научиться и явно чего-то не понимаю. Может кто-нибудь помочь?


person Preston    schedule 11.09.2020    source источник


Ответы (1)


У вас есть несколько ошибок.

Измените vectorum на vectornum.

Измените подключения экземпляра вашего модуля, чтобы не возникало конфликтов с сигналами тестового стенда для zeroexpected и yexpected.

Измените сигналы, подключенные к выходам модуля, с reg на wire.

module testALU();
   reg clk;
   reg [31:0] a, b, yexpected;
   reg [2:0]  f;
   wire [31:0] y; 
   reg        zeroexpected;
   wire        zero;
   reg [31:0] vectornum, errors;
   reg [100:0] testvectors[10000:0];

   ALU dut(a,b,f,y,zero);

   always
     begin
        clk = 1; #5; clk = 0; #5;
     end

   initial
     begin
        $readmemb("test.tv", testvectors);
        vectornum = 0; errors = 0;
     end

   always @(posedge clk)
     begin
        #1; {a,b,f,yexpected,zeroexpected} = testvectors[vectornum];
     end

   always @(negedge clk)
     begin
        if (y !== yexpected) begin
           $display("Error: inputs = %b", {a,b,f});
           $display(" outputs = %b (%b expected)", y, yexpected);
           errors = errors + 1;
        end

        vectornum = vectornum + 1;
        if (testvectors[vectornum] === 100'bx) begin
           $display("%d tests completed with %d errors", vectornum, errors);
           $stop;
        end
     end
endmodule   

Это исправляет все ошибки компиляции.

person toolic    schedule 11.09.2020