2016-07-12 13 views
0

Ich möchte den Parameterwert in Verilog abhängig vom 3-Bit-Wert des digitalen Eingangspins ändern. Hier ist ein Beispiel aus meinem Verilog-Code.Ändern des Parameterwerts in Verilog

paramter real C_IP=0; 

always @ (reg_DACIP) 
    begin 
    case (reg_DACIP) 
     3'b000 : C_IP = 0.8; 
     3'b001 : C_IP = 0.6; 
     3'b010 : C_IP = 0.4; 
     3'b011 : C_IP = 0.2; 
     3'b100 : C_IP = 0.0; 
     3'b101 : C_IP = -0.2; 
     3'b110 : C_IP = -0.4; 
     3'b111 : C_IP = -0.6; 
    endcase 
end 

Wenn ich kompilieren ich diesen Fehler:

ncvlog: *E,PANOTL: A parameter is not a legal lvalue [3.10(IEEE)]. 
     3'b001 : C_IP = 0.6; 

Ich verstehe Verilog Parameter für Konstanten sind, und kann daher nicht während der Simulation geändert werden. Was wäre jedoch die beste Umgehungsmöglichkeit für dieses Problem?

Antwort

3

Parameter müssen eine Konstante sein, es gibt keinen Weg um sie herum. Ein Parameter kann eine Funktion anderer Parameter sein. Ein Parameter kann zur Kompilierungs-/Bearbeitungszeit über #() in Modulinstanz oder defpram in eine andere Konstante geändert werden (Hinweis: defpram ist für Abschreibung vorgesehen). Ein Parameter wird auf seinen neuen Wert aktualisiert, wenn die Parameter, von denen er abgeleitet ist, während der Kompilierung/Verarbeitung geändert werden. Beispiele für Parameter von einem anderen Parameter abgeleitet:

// nested conditional statement 
parameter real C_I P = PARAM_DACIP==3'b000 ? 0.8 : 
         PARAM_DACIP==3'b001 ? 0.6 : 
         PARAM_DACIP==3'b010 ? 0.4 : 
         PARAM_DACIP==3'b011 ? 0.2 : 
         PARAM_DACIP==3'b100 ? 0.0 : 
         PARAM_DACIP==3'b101 ? -0.2 : 
         PARAM_DACIP==3'b110 ? -0.4 : -0.6; 

// simple expression 
parameter real C_IP = 0.2*(3'b100-PARAM_DACIP); 

// pure static function (i.e. output only determined from input) 
// Note: not all simulators/synthesizers support this 
function real calc_C_IP(input [2:0] DACIP); 
begin 
    case (DACIP) 
    3'b000 : calc_C_IP = 0.8; 
    3'b001 : calc_C_IP = 0.6; 
    3'b010 : calc_C_IP = 0.4; 
    3'b011 : calc_C_IP = 0.2; 
    3'b100 : calc_C_IP = 0.0; 
    3'b101 : calc_C_IP = -0.2; 
    3'b110 : calc_C_IP = -0.4; 
    3'b111 : calc_C_IP = -0.6; 
    endcase 
end 
endfunction 
parameter real C_IP = calc_C_IP(PARAM_DACIP); 

wenn reg_DACIP muss ein Register sein, dann kann kein C_IP Parameter sein. Sie können machen es zu einem regelmäßigen real

FYI: real ist nicht synthetisierbaren

+0

Dank Greg. Was ist in Ihrem Funktionsbeispiel PARAM_DACIP? DACIP ist ein 3-Bit-Logikeingang in meinem Code. Wie übergebe ich es an die Funktion calc_C_IP? – sanforyou

+0

Was ist PARAM_DACIP auch in Ihrer faustgeschachtelten bedingten Anweisungslösung? Wie kann ich es mit dem 3-Bit-DACIP-Eingangspin in Verbindung bringen? – sanforyou

+0

@Sandeep, in Ihrem ursprünglichen Code haben Sie 'reg_DACIP' verwendet, von dem ich annahm, dass es ein 'reg'-Typ war. In meinem Beispiel habe ich' reg_' in 'PARAM_' geändert, um zu bestätigen, dass es ein Parameter und kein Register ist. Sie nehmen an, dass 'PARAM_DACIP' definiert ist als' parameter [2: 0] PARAM_DACIP = 3'b100; '(oder ein anderer Wert) – Greg