2016-07-12 4 views
0

Я хотел бы изменить значение параметра в Verilog в зависимости от 3-битного цифрового входного значения. Вот пример из моего кода verilog.Изменение значения параметра в 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 

Когда я компилирую, я получаю эту ошибку:

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

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

ответ

3

Параметры должны быть постоянными, его нет. Параметр может быть функцией других параметров. Параметр может быть изменен на другую константу в момент компиляции/разработки через #() в модульном instanciation или defpram (примечание defpram планируется для амортизации). Параметр будет обновляться до нового значения, если параметр (ы), из которого он получен, изменяется во время компиляции/разработки. Примеры параметров, полученных из другого параметра:

// 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); 

, если reg_DACIP должен быть регистр, то C_IP не может быть параметром. Вы можете сделать это обычный real

FYI: real не синтезируемого

+0

Спасибо Грег. В примере с вашей функцией, что такое PARAM_DACIP? DACIP - это 3-битный логический входной штырь в моем коде. Как передать его функции calc_C_IP? – sanforyou

+0

Также в вашем решении с условным выражением в кулаке, что такое PARAM_DACIP? Как я могу связать его с 3-битным входным контактом DACIP? – sanforyou

+0

@Sandeep, в вашем исходном коде вы использовали 'reg_DACIP', который, как я предполагал, был' reg', я изменил 'reg_' на' PARAM_' в моем примере, чтобы sugest был параметром, а не регистром. вы предполагаете, что 'PARAM_DACIP' определяется как' параметр [2: 0] PARAM_DACIP = 3'b100; '(или какое-то другое значение) – Greg