ModelSim中Verilog函数运行报Verilog 2001全局声明非法错误求助
错误原因排查
- 核心触发错误:Verilog 2001语法标准不允许在
module、package这类容器外部声明function/task,你当前将function定义在了全局作用域(所有module之外),属于非法全局声明,直接触发该编译报错。 - 隐藏语法错误:function属于组合逻辑上下文,只能使用阻塞赋值
=,你代码中使用的非阻塞赋值<=是时序逻辑专用语法,即便把function移入module内部也会编译异常或者产生错误逻辑。 - 冗余逻辑提示:代码中的
if (in)判断没有必要,逻辑右移对输入为0的场景同样适用,直接执行移位即可,删掉该分支可以简化逻辑。
修正方案
方案1:移入module内部修正语法
将function放到对应module的内部声明区域,同时修改赋值语法,示例如下:
module your_target_module( // 此处填写你的module端口定义 ); // function放在module内部、端口定义之后 function [24:0] shiftright(input [24:0] in); integer i; begin for (i=0; i<25; i=i+1) begin shiftright[i] = (i == 24) ? 1'b0 : in[i+1]; end end endfunction // 此处填写你的其他module逻辑 endmodule
方案2:直接用原生运算符实现(更推荐)
Verilog原生提供逻辑右移运算符>>>,不需要手写for循环实现,25位数据右移1位直接写in >>> 1即可,和你自定义function的逻辑完全等效,代码更简洁且不会引入手写错误。如果需要右移N位,直接修改运算符右侧数值即可,比如右移4位写in >>> 4。
内容的提问来源于stack exchange,提问作者NTD_282
相关产品推荐
相关产品推荐

