2016-12-28 1 views
0

Я имею попытаться использовать определения для упрощения записи и все параметры действительно написанынекоторые вопросы DEFINE метод использования в NCVERILOG

//... 
parameter BLEZ = 1001011; 
parameter BLTZ = 1001100; 
parameter SRA = 1001101; 

`define R_type1 ((op == MOVA)||(op == MOVB)||(op == ADD)||(op == SUB)||(op == AND)||(op == OR)||(op == XOR)||(op == NOT)||(op == SLT)) 
`define R_type2 ((op == LSL)||(op == LSR)||(op == SRA)) 
`define JR_type ((op == JMR)) 
`define J_type ((op == JMP)) 
`define I_type ((op == ADI)||(op == SBI)||(op == ANI)||(op == ORI)||(op == XRI)||(op == AIU)||(op == SIU)(op == JML)) 
`define LW ((op == LD)) 
`define SW ((op == ST)) 
`define Branch ((op == BZ)||(op == BNZ)||(op == BGEZ)||(op == BGTZ)||(op == BLEZ)||(op == BLTZ)) 

[email protected](op) 
begin 
RegWrite_id = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
RegDst_id  = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
MemWrite_id = 1;//(`SW); 
MemRead_id  = (`LW); 
MemToReg_id = (`LW); 
ALUSrcA_id  = (`R_type2); 
ALUSrcB_id  = (`I_type); 
PCSource  = {`JR_type,`J_type,Z}; 
end 

Я думаю, что нет ничего плохого в логическом уровне, но он всегда давал некоторую ошибку как это:

RegWrite_id = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
                 | 
ncvlog: *E,EXPRPA (Decode_Unit.v,71|56): expecting a right parenthesis (')') [4.3][9.7(IEEE)]. 
(`define macro: I_type [Decode_Unit.v line 64], file: Decode_Unit.v line 71) 
RegWrite_id = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
                  | 
ncvlog: *E,EXPSMC (Decode_Unit.v,71|58): expecting a semicolon (';') [9.2.2(IEEE)]. 
RegWrite_id = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
                  | 
ncvlog: *E,NOTSTT (Decode_Unit.v,71|58): expecting a statement [9(IEEE)]. 
RegDst_id  = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
       | 
ncvlog: *E,EXPLPA (Decode_Unit.v,72|15): expecting a left parenthesis ('(') [12.1.2][7.1(IEEE)]. 
RegDst_id  = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
                 | 
ncvlog: *E,EXPRPA (Decode_Unit.v,72|56): expecting a right parenthesis (')') [4.3][9.7(IEEE)]. 
(`define macro: I_type [Decode_Unit.v line 64], file: Decode_Unit.v line 72) 
RegDst_id  = ((`LW)||(`R_type1)||(`R_type2)||(`I_type)); 
                  | 
ncvlog: *E,EXPSMC (Decode_Unit.v,72|58): expecting a semicolon (';') [12.1.2][7.1(IEEE)]. 
MemWrite_id = 1;//(`SW); 
       | 
ncvlog: *E,EXPLPA (Decode_Unit.v,73|15): expecting a left parenthesis ('(') [12.1.2][7.1(IEEE)]. 
MemRead_id  = (`LW); 

и все параметры действительно написаны

это смущает ....
, пожалуйста, дайте мне несколько коучингов

ответ

1

Вы забыли оператора || между двумя последними условиями в макросе I_type.

Также обратите внимание, что если вы хотите, чтобы ваши параметры должны быть интерпретированы как двоичное число, вам придется добавить 'b перед ними, например, 'b1010 это число десять в двоичном виде, а 1010 является тысяча десять.

0

Как уже указывал Унн, I_type отсутствует ||, и необходимо указать радиус (в противном случае он считается десятичным).

пример 'b1010 - номер десять в двоичном формате, в то время как 1010 - одна тысяча десять.

Кроме того, `define являются болезненными для отладки, как вы испытали. Имейте в виду, что `define применяются к глобальному пространству, основанному на порядке компиляции. Это означает, что другой модуль может использовать один и тот же макрос, не определяя его, если он был скомпилирован последним, что может привести к путанице, а ошибки выполняются неправильно. Рекомендуется избегать (или, по крайней мере, минимизировать) использование `define в RTL.

С вашим кодом я предлагаю изменить ваш `define на wire. Он будет синтезироваться, но гораздо легче отлаживать. Я интеллектуально оставил ошибку ||, чтобы продемонстрировать.

wire R_type1 = ((op == MOVA)||(op == MOVB)||(op == ADD)||(op == SUB)||(op == AND)||(op == OR)||(op == XOR)||(op == NOT)||(op == SLT)); 
wire R_type2 = ((op == LSL)||(op == LSR)||(op == SRA)); 
wire JR_type = ((op == JMR)); 
wire J_type = ((op == JMP)); 
wire I_type = ((op == ADI)||(op == SBI)||(op == ANI)||(op == ORI)||(op == XRI)||(op == AIU)||(op == SIU)(op == JML)); 
wire LW  = ((op == LD)); 
wire SW  = ((op == ST)); 
wire Branch = ((op == BZ)||(op == BNZ)||(op == BGEZ)||(op == BGTZ)||(op == BLEZ)||(op == BLTZ)); 

[email protected]* // IMPORTANT :: use '*', not 'op' 
begin 
    RegWrite_id = ((LW)||(R_type1)||(R_type2)||(I_type)); 
    RegDst_id  = ((LW)||(R_type1)||(R_type2)||(I_type)); 
    MemWrite_id = 1;//(SW); 
    MemRead_id  = (LW); 
    MemToReg_id = (LW); 
    ALUSrcA_id  = (R_type2); 
    ALUSrcB_id  = (I_type); 
    PCSource  = {JR_type,J_type,Z}; 
end 

Комбинированные всегда блоки должны использовать авточувствительность; [email protected]* или синонимом [email protected](*). Автоматическая чувствительность поддерживалась с IEEE1364-2001. Указание списка чувствительности рекомендуется только для строгого IEEE1364-1995 или для исключения сигналов в модуле поведения, которые не будут синтезированы.

Смежные вопросы