SystemVerilog中priority casez在同步always块不可综合问题求解
问题原因排查
首先你遇到的报错和priority casez本身的可综合性无关,错误来自两个代码编写问题:
- 关键字拼写错误:SystemVerilog 关键字区分大小写,你写的大写
Priority属于非法语法,正确关键字为小写priority - 异步复位逻辑缺失:你的always块敏感列表包含
negedge rst异步复位触发条件,但代码块内没有任何复位分支判断,不符合可综合时序逻辑的编码规范,这是触发你报错的直接原因。
priority casez本身是标准可综合语法,主流FPGA、ASIC综合工具均提供支持,只要写法符合规范不会出现综合问题。
最优实现方案
你要实现的提取4位sel最低有效置位位的需求,不需要写分支判断,用位运算即可实现,代码更简洁,综合后的电路面积、时序表现更优,核心逻辑公式为:check = sel & (~sel + 1'b1);
该逻辑通用任意位宽的sel信号,无需修改即可扩展到更高位宽的请求仲裁场景。
可综合代码示例
方案1:修正后的priority casez版本
always @(posedge clk or negedge rst) begin // 补充异步复位逻辑 if(!rst) begin check <= 4'd0; end else begin priority casez(sel) 4'b???1: check <= 4'd1; 4'b??1?: check <= 4'd2; 4'b?1??: check <= 4'd4; 4'b1???: check <= 4'd8; default: check <= 4'd0; endcase end end
注:原代码中4'b0000分支和default分支功能重复,可以直接删除冗余的4'b0000分支。
方案2:位运算最优版本
always @(posedge clk or negedge rst) begin if(!rst) begin check <= 4'd0; end else begin check <= sel & (~sel + 1'b1); end end
内容的提问来源于stack exchange,提问作者Frog the Freddie
相关产品推荐
相关产品推荐

