verilog error lado izquierdo de la asignación debe tener un tipo de datos variable

0

Tengo un verilog como módulo me sale el error

Error (10137): Verilog HDL Procedural Assignment error object "result" on

left-hand side of assignment must have a variable data type

Si agrego también reg [31:0] result; , recibo otro error

Error (10028): Can't resolve multiple constant 
drivers for net "tempreg[0][31]" at mips_core_testbench.v(55)
.
.
.
.
Error (10028): Can't resolve multiple constant 
drivers for net "tempreg[0][14]" at mips_core_testbench.v(55)
Error (12153): Can't elaborate top-level user hierarchy

Código:

module testbench (result, input_instruction, rs_content, rt_content);
    output [31:0] result;
    //reg [31:0] result;
    input [31:0] input_instruction;
    input [31:0] rs_content;
    input [31:0] rt_content;
    reg [31:0] tempreg [0:31];
    integer type;
    integer i;  

initial begin
    tempreg[0] = 1;
for (i = 1; i <= 31; i = i + 1)
        tempreg[i] <= 0;

end

    always@ (input_instruction) begin
        if(input_instruction[31:26] == 6'b000000)
            type = 1; // R-type
        else
            type = 0; // I-type
    end

    always@ (type) begin
        case(input_instruction[5:0])
            //add
            6'b100000:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] + tempreg[input_instruction[20:16]];
            //sub
            6'b100010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] - tempreg[input_instruction[20:16]];
            //and
            6'b100100:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] & tempreg[input_instruction[20:16]];
            //or
            6'b100101:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] | tempreg[input_instruction[20:16]];
            //sra
            6'b000011:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] >>> input_instruction[10:6];
            //srl
            6'b000010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] >> input_instruction[10:6];
            //sll
            6'b000010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] << input_instruction[10:6];
            //sltu------
            //6'b101011:


        endcase
    end

        always@ (!type) begin
        case(input_instruction[31:26])
            //addi
            6'b001000:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] + tempreg[input_instruction[15:0]];
            //addiu----
            //6'b001001:
            //andi
            6'b001100:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] & tempreg[input_instruction[15:0]];
            //ori
            6'b001101:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] | tempreg[input_instruction[15:0]];
            //slti
            6'b001010:
                begin
                    if (tempreg[input_instruction[15:0]] - tempreg[input_instruction[25:21]] > 0 )          
                        tempreg[input_instruction[20:16]] = 1;
                    else
                        tempreg[input_instruction[20:16]] = 0;
                end
            //lui
            6'b001111:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[15:0]] << 16'b0;


        endcase
    end

    always @(type or tempreg[input_instruction[15:11]] or tempreg[input_instruction[20:16]])
begin

  if (type == 1)
    result <= tempreg[input_instruction[15:11]];
  else
    result <= tempreg[input_instruction[20:16]];

end

endmodule

Código editado:

module testbench (result, input_instruction, rs_content, rt_content);
    output reg[31:0] result;
    input [31:0] input_instruction;
    input [31:0] rs_content;
    input [31:0] rt_content;
    reg [31:0] tempreg [0:31];
    integer type;
    integer i;  

initial begin
    tempreg[0] = 1;
for (i = 1; i <= 31; i = i + 1)
        tempreg[i] = 0;

end

    always@ (input_instruction) begin
        if(input_instruction[31:26] == 6'b000000)
            type = 1; // R-type
        else
            type = 0; // I-type
    end

always @ * begin
    if (type) begin
        case (input_instruction[5:0])
         //add
            6'b100000:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] + tempreg[input_instruction[20:16]];
            //sub
            6'b100010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] - tempreg[input_instruction[20:16]];
            //and
            6'b100100:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] & tempreg[input_instruction[20:16]];
            //or
            6'b100101:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[25:21]] | tempreg[input_instruction[20:16]];
            //sra
            6'b000011:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] >>> input_instruction[10:6];
            //srl
            6'b000010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] >> input_instruction[10:6];
            //sll
            6'b000010:
            tempreg[input_instruction[15:11]] = tempreg[input_instruction[20:16]] << input_instruction[10:6];
            //sltu------
            //6'b101011:
        endcase
    end else begin
        case (input_instruction[31:26])
             //addi
            6'b001000:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] + tempreg[input_instruction[15:0]];
            //addiu----
            //6'b001001:
            //andi
            6'b001100:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] & tempreg[input_instruction[15:0]];
            //ori
            6'b001101:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[25:21]] | tempreg[input_instruction[15:0]];
            //slti
            6'b001010:
                begin
                    if (tempreg[input_instruction[15:0]] - tempreg[input_instruction[25:21]] > 0 )          
                        tempreg[input_instruction[20:16]] = 1;
                    else
                        tempreg[input_instruction[20:16]] = 0;
                end
            //lui
            6'b001111:
            tempreg[input_instruction[20:16]] = tempreg[input_instruction[15:0]] << 16'b0;
        endcase
    end
end

always @(type or tempreg[input_instruction[15:11]] or tempreg[input_instruction[20:16]])
begin

  if (type == 1)
    result = tempreg[input_instruction[15:11]];
  else
    result = tempreg[input_instruction[20:16]];

end

endmodule
    
pregunta askque

2 respuestas

2

Ha declarado que result en su declaración de módulo es del tipo wire . No puede asignar valores a los cables en bloques always .

En su lugar, debe declarar result como el tipo correcto como se explica en esta pregunta de StackOverflow (gracias @Greg).

output [31:0] result;
reg [31:0] result;

Esto lo hace del tipo reg que se puede asignar en un bloque always .

Sin embargo, este no es tu único problema. Está asignando valores a temp_reg en dos bloques always diferentes. Esto no esta permitido. Solo puede tener un controlador (un bloque always o una declaración assign ) para cualquier señal. De lo contrario, ¿cómo puede implementarlo en la lógica?

Puedes arreglar esto haciendo:

always @ * begin
    if (type) begin
        case (...)
             ...
        endcase
    end else begin
        case (...)
             ...
        endcase
    end
end
    
respondido por el Tom Carpenter
1

Necesitas que result sea un reg . Si desea continuar utilizando ANSI, utilice:

output [31:0] result;
reg [31:0] result;

Para el uso del encabezado ANSI:

module testbench (
  output reg [31:0] result,
  input [31:0] input_instruction,
  input [31:0] rs_content,
  input [31:0] rt_content );

tempreg como asignado en dos bloques siempre, lo cual no es muy adaptable. always @(type) y always @(!type) no funcionan de la manera en que estás pensando. Ambos se activarán en un cambio de valor, pero el valor en sí no importa. Combine en uno always @* (ya no estamos en 1995, no tenemos la lista completa de sensibilidad).

Debería usar always @* (o los sinónimos always @(*) ) para todos los bloques lógicos combinacionales, y usar asignaciones de bloqueo ( = ) en lugar de no bloquear ( <= ). Se debe usar el no bloqueo para asignar flip-flops y pestillos, todo lo demás debería estar bloqueando.

Asegúrese de que a cada bit de tempreg se le asigne un valor en una pasada del bloque siempre. De lo contrario, está inferiendo latches sensibles al nivel.

Editar:
Mirando tu código otra vez, vas a necesitar un reloj. tempreg está almacenando valores y no será una lógica puramente combinacional. Use la plantilla a continuación y use las asignaciones no bloqueantes para tempreg . Si no usa el reloj, tendrá una compleja lógica de enganche. Si no usa el no bloqueo, entonces hay una condición de carrera potencial en el simulador Verilog.

always @(posedge clk) begin
    if (type) begin
        case (...)
             ... // use non-blocking assignments here
        endcase
    end else begin
        case (...)
             ... // use non-blocking assignments here
        endcase
    end
end

Te aconsejo que busques encabezados de estilo ANSI. Además, trate de no usar type como nombre de variable, ya que no es comparable con SystemVerilog.

    
respondido por el Greg

Lea otras preguntas en las etiquetas