You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:36:06