SystemVerilog汉明(7,4)编码器报错:不支持过程赋值的解决方法
解决SystemVerilog中always块内procedural assign不支持的错误(汉明(7,4)编码器)
你遇到的[Synth 8-27] procedural assign not supported错误,根源是SystemVerilog不允许在过程块(比如always @(*))内部使用assign语句——这是SystemVerilog相较于Verilog的语法严格化要求,你的代码在Verilog里能通过,但不符合SystemVerilog的规范。
以下是两种保留原位拼接逻辑的修复方案:
方案1:将assign替换为过程赋值
直接在always @(*)块内用过程赋值(=)给hamcode赋值,因为hamcode是output logic类型,支持在过程块内直接赋值:
module eccproj( input logic [3:0] data_in, output logic [6:0] hamcode); logic p1,p2,p4; always @(*) begin p1 = data_in[0] + data_in[1] + data_in[3]; p2 = data_in[0] + data_in[2] + data_in[3]; p4 = data_in[1] + data_in[2] + data_in[3]; // Input : d3 d2 d1 d0 //Output : d7 d6 d5 p4 d3 d2 d1 hamcode = {data_in[3:1] , p4 , data_in[0] , p2 , p1}; // 替换assign为直接过程赋值 end endmodule
方案2:将assign移到过程块外部
把校验位生成和输出拼接都改成连续赋值,拆分逻辑结构,更符合SystemVerilog的模块化风格:
module eccproj( input logic [3:0] data_in, output logic [6:0] hamcode); logic p1,p2,p4; // 连续赋值生成校验位 assign p1 = data_in[0] + data_in[1] + data_in[3]; assign p2 = data_in[0] + data_in[2] + data_in[3]; assign p4 = data_in[1] + data_in[2] + data_in[3]; // Input : d3 d2 d1 d0 //Output : d7 d6 d5 p4 d3 d2 d1 assign hamcode = {data_in[3:1] , p4 , data_in[0] , p2 , p1}; // 移到过程块外 endmodule
两种方案都能完全保留你需要的输入位与校验位的拼接逻辑,且符合SystemVerilog语法规范,可以正常通过Vivado综合。
内容的提问来源于stack exchange,提问作者Achyuth SS
相关产品推荐
相关产品推荐

