ModelSim编译Verilog奇偶校验模块报错:assign处语法错误
解决ModelSim编译Verilog奇偶校验模块的语法错误
错误原因拆解:你代码里的
endfunction : assign o_parity_out这行完全踩了语法坑!endfunction后面如果加标签,只能是和function同名的标识符,不能直接把assign语句塞这儿。assign是属于module层级的赋值逻辑,必须放在function定义的外部。修正后的完整代码:
`define WIDTH 8 module Parityfunc( input [`WIDTH-1:0] i_data, output o_parity_out, input parity_type ); function parity (input [`WIDTH-1:0] data, input parity_type); begin if (parity_type) // 偶校验 parity = ^data; // 划重点:function内部要用阻塞赋值=,非阻塞<=是给时序逻辑always块用的 else // 奇校验,这里不用多此一举判断!parity_type,else就足够覆盖 parity = ~(^data); end endfunction // 把assign语句移到function定义结束后,放在module层级下才合规 assign o_parity_out = parity(i_data, parity_type); endmodule // Parityfunc
- 额外优化提示:
- 原代码里的
else if (!parity_type)可以直接简化成else,逻辑完全等价,还能让代码更清爽。 - 记住function内部给返回值赋值必须用阻塞赋值,用非阻塞赋值不仅没必要,还可能引发奇怪的编译或仿真问题。
- 原代码里的
内容的提问来源于stack exchange,提问作者JYasir
相关产品推荐
相关产品推荐

