首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于NCVERILOG中定义使用方法的几个问题

关于NCVERILOG中定义使用方法的几个问题
EN

Stack Overflow用户
提问于 2016-12-28 11:15:33
回答 2查看 332关注 0票数 0

我尝试使用define来简化编写,所有的参数都是真正编写的

代码语言:javascript
运行
复制
//...
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))

always@(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

我认为在逻辑层面上没有什么问题,但它总是会给出这样的错误:

代码语言:javascript
运行
复制
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);

所有的参数都是真正写好的

这让人困惑..。

请给我一些指导

EN

回答 2

Stack Overflow用户

发布于 2016-12-30 11:10:07

您忘记了I_type宏中最后两个项之间的||运算符。

另请注意,如果您希望将参数解释为二进制数,则必须在参数前面添加'b,例如,'b1010是二进制数字10,而1010是1,010。

票数 1
EN

Stack Overflow用户

发布于 2017-01-04 03:57:23

正如Unn已经指出的,I_type缺少||和,需要指定基数(否则假定为十进制)。

示例'b1010是二进制数字10,而1010是1,010。

此外,正如您所经历的那样,`define的调试是一个痛苦的过程。请注意,`define根据编译顺序应用于全局空间。这意味着另一个模块可以使用相同的宏,而不定义它,如果它是稍后编译的,这可能会导致混乱和错误不能正确完成。建议避免(或至少最小化)在RTL中使用`define

对于您的代码,我建议将您的`define更改为wire。它将合成到相同的,但更容易调试。为了演示,我明智地留下了||的bug。

代码语言:javascript
运行
复制
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));

always@* // 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

组合always块应该使用自动敏感;always@*或同义的always@(*)。自IEEE1364-2001以来一直支持自动灵敏度。指定敏感度列表仅建议您严格遵循IEEE1364-1995,或者用于不会综合的行为模块中的排除信号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41354897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档