большая проблема с 8-битным ALU, программа не остановится, и мне просто нужно убедиться, что спецификации достигнуты в verilog

У меня большая проблема с 8-битным ALU. Начнем с того, что код не перестанет работать. во-вторых, была дана таблица спецификаций, и я считаю, что некоторые из них отсутствуют

вот характеристики:

Входные данные спецификации: A (8 бит), B (8 бит) Управляющие входы: S (1 бит), E (1 бит) Выход: W (8 бит)

Выход W должен быть равен 0, если E = 0. Если E = 1, то W = A + B для S = 0 и W = A - B для S = 1.

вот код:

`timescale 1ns / 1ps

module ALU8bit( Opcode,

                Operand1,

                Operand2,

                Result,

                flagC,

                flagZ

              );    

input [2:0]  Opcode;

input [7:0]  Operand1,

             Operand2;

     

output reg [15:0] Result = 16'b0;

output reg  flagC = 1'b0,

            flagZ = 1'b0;   

parameter  [2:0] ADD = 3'b000,

                 SUB = 3'b001,

                 MUL = 3'b010,

                 AND = 3'b011,

                 OR = 3'b100,

                 NAND = 3'b101,

                 NOR = 3'b110,

                 XOR = 3'b111;      

always @ (Opcode or Operand1 or Operand2)

begin

 case (Opcode)

 ADD: begin

   Result = Operand1 + Operand2;

   flagC  = Result[8];

   flagZ  = (Result == 16'b0);

  end

 SUB: begin

   Result = Operand1 - Operand2;

   flagC  = Result[8];

   flagZ  = (Result == 16'b0);

  end

 MUL: begin

   Result = Operand1 * Operand2;

   flagZ  = (Result == 16'b0);

  end

 AND: begin

   Result = Operand1 & Operand2;

   flagZ  = (Result == 16'b0);

  end

 OR:  begin

    Result = Operand1 | Operand2;

    flagZ  = (Result == 16'b0);

   end

 NAND: begin

   Result = ~(Operand1 & Operand2);

   flagZ  = (Result == 16'b0);

  end

 NOR: begin

   Result = ~(Operand1 | Operand2);

   flagZ  = (Result == 16'b0);

  end

 XOR: begin

   Result = Operand1 ^ Operand2;

   flagZ  = (Result == 16'b0);

  end

 default: begin

   Result = 16'b0;

   flagC  = 1'b0;

   flagZ  = 1'b0;

  end

 endcase

end

endmodule

а вот и тестовый стенд:

`timescale 1ns / 1ps
`include "alu_8bit.v"
module alu_8bit_test;

 // Inputs

 reg [2:0] Opcode;

 reg [7:0] Operand1;

 reg [7:0] Operand2;

 // Outputs

 wire [15:0] Result;

 wire flagC;

 wire flagZ;

 //Temporary variable

 reg [2:0] count = 3'd0;

 // Instantiate the Unit Under Test (UUT)

 ALU8bit uut (

  .Opcode(Opcode), 

  .Operand1(Operand1), 

  .Operand2(Operand2), 

  .Result(Result), 

  .flagC(flagC), 

  .flagZ(flagZ)

  );

 initial begin
     $display("Start of Test.");
        $dumpfile("alu_8bit.vcd");
        $dumpvars(0, alu_8bit_test);
        // Initialize Inputs

        Opcode   = 3'b0;

        Operand1 = 8'd0;

         Operand2 = 8'd0;

         // Wait 100 ns for global reset to finish

         #100;    
           $display("End of Test.");
        // Add stimulus here  

         Operand1 = 8'hAA;

         Operand2 = 8'h55;  

         for (count = 0; count < 8; count = count + 1'b1) 

         begin

            Opcode = count;

            #20;
        end

    end     

endmodule

Я очень ценю любую помощь, которую вы, ребята, можете мне предоставить.


person GHG HGH    schedule 26.03.2021    source источник


Ответы (1)


Диапазон вашей переменной count составляет от 0 до 7. Это означает, что count всегда будет меньше 8, а ваше выражение count < 8 всегда будет истинным. Это приводит к тому, что цикл for становится бесконечным, поэтому симуляция никогда не останавливается.

Сдача:

reg [2:0] count = 3'd0;

to:

integer count = 0;
person toolic    schedule 26.03.2021