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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:05:29