Necesito ayuda con el código verilog, ¿tengo problemas?

-4

Básicamente estoy configurando diferentes señales de control para que la ALU realice operaciones en verilog. Pero he intentado todas las formas posibles de escribir lo que quiero, pero en vano, ¿puedes ayudarme? ¿Cómo debo configurar estas señales de control en determinados estados de alu de 3 bits?

Este es mi código, tengo todas las asignaciones posibles; (lo siento, está invertido y no sé cómo girarlo porque el sitio web en el que subí las imágenes lo giró automáticamente de esta manera)

Declaraciones iniciales;

input [1:0] op, src, srl, dst_ram_mux, dst_q_mux;
input inv_s, inv_r, sel, dst_ram_en, dst_qen, dst_y, cin, reg_wr, cp;

 95 always @(i[5] or i[4] or i[3])
 96 begin
 97 if( i[5]==0  && i[4] == 0 && i[3] == 0)         // this is add   S+R
 98 begin
 99      cin <= 0;
 100     assign sel = 0;
 101     inv_s <= 0;
 102     assign inv_r = i[5] & i[4] & i[3];
 103     op[1] = i[5] & i[4] & i[3];                                        
 104     op[0] = 0;
 105 end

El 'final' para el siempre está muy abajo en la línea 327, no se ve aquí

Los errores para todas las asignaciones;

enlace

    
pregunta user124627

2 respuestas

3

Lee el mensaje de error:

  

Una red no es un valor legal en este contexto

  • Los bloques de procedimiento solo pueden asignar tipos de registros (Verilog: reg , SystemVerilog: logic / bit / reg ). La asignación tampoco se puede hacer a una entrada
  • La lógica combinacional debe tener asignaciones de bloqueo ( = ) solamente, no sin bloqueo ( <= )
  • No debe usar asignaciones continuas de procedimiento ( assign dentro de un bloque de procedimiento)
  • Cada bit asignado debe tener una asignación para cada condición. De lo contrario se infiere un pestillo. Una estrategia fácil es asignar valores predeterminados a todos los registros en la parte superior de un bloque de procedimiento, el código restante anula el valor predeterminado.

Otras directrices:

  • La expatriación de bits no es necesaria:
  • i[5]==1 && i[4]==0 && i[3]==1 - > %código%
  • Use la lista de sensibilidad automática para la combinación i[5:3]==3'b101 (o el% Ver_de% SystemVerilog)
  • El resto está anidado, si se comparan los mismos valores en que los bits pueden usar declaraciones de un caso


always_comb begin
  /* default assignments: e.g: cin='1; op='0; */
  case(i[5:3])
    3'b000 : begin /*S+R code*/ end
    3'b001 : begin /*S-R code*/ end
    3'b010 : begin /*R-S code*/ end
    // ... Other conditions ...
  endcase
end
    
respondido por el Greg
2
  1. No puede colocar una declaración de asignación dentro de un bloque de procedimiento.

  2. No puede asignar un valor a una red de entrada.

Si desea cambiar el valor de algo dentro de un bloque de procedimiento, defínalo como un registro y cambie su valor con = o < =.

Por ejemplo

module test(input clk);
reg x;
always @(posedge clk) begin
     x <= ~x;
end
endmodule;
    
respondido por el The Photon

Lea otras preguntas en las etiquetas