可综合Verilog实现一维触发器阵列双写入的技术咨询
可综合Verilog实现双写入触发器阵列的技术建议
问题背景
需要实现一维触发器阵列的双写入功能:同一时钟周期内可执行两个写操作,且当两个写使能均有效时,写地址绝不会重叠。现有代码在Synopsys VCS仿真中表现正确,但不确定Design Compiler能否综合出正确的门电路,寻求专业建议。
用户当前代码:
// Both wr_en_a and wr_en_b can be asserted on the same clock. logic wr_en_a, wr_en_b; // wr_addr_a and wr_addr_b are never equal when wr_en_a and wr_en_b are both asserted. logic [4:0] wr_addr_a, wr_addr_b; logic [15:0] track_vec; always_ff @(posedge clk) begin if (rst_q) begin track_vec <= '0; end else begin if (wr_en_a) begin track_vec[wr_addr_a] <= wr_en_a; end if (wr_en_b) begin track_vec[wr_addr_b] <= ~wr_en_b; end end end
综合可行性分析
你的代码可以被Design Compiler正确综合,原因如下:
- 代码采用两个独立的
if语句处理双写操作,且明确约束了双写使能有效时地址不重叠,综合工具能够识别这种无冲突的写操作场景,不会生成逻辑冲突的门电路。 - 对于触发器阵列的每一位,工具会生成对应的多路选择逻辑:当无写使能时保持原值;当
wr_en_a有效时,将该位更新为wr_en_a;当wr_en_b有效时,更新为~wr_en_b;由于地址不重叠,同一时刻不会有两个写操作作用于同一位,因此不存在竞争风险。
优化建议
- 修正写数据逻辑:当前代码写入的是写使能信号本身(或其取反),这大概率不是实际需求。建议定义独立的写数据信号
wr_data_a和wr_data_b,明确写入内容,示例代码如下:
// 双写使能可同时有效,且有效时地址不重叠 logic wr_en_a, wr_en_b; logic [4:0] wr_addr_a, wr_addr_b; logic [15:0] wr_data_a, wr_data_b; // 独立写数据信号 logic [15:0] track_vec; always_ff @(posedge clk) begin if (rst_q) begin track_vec <= '0; end else begin // 先保持原值,再根据写使能覆盖对应位 track_vec <= track_vec; if (wr_en_a) begin track_vec[wr_addr_a] <= wr_data_a[wr_addr_a]; end if (wr_en_b) begin track_vec[wr_addr_b] <= wr_data_b[wr_addr_b]; end end end
添加综合约束:为了让Design Compiler更精准地优化逻辑,需将“双写使能有效时地址不重叠”的约束告知工具。可以通过以下方式实现:
- 使用DC命令:
set_case_analysis 1 [expr {!$wr_en_a || !$wr_en_b || $wr_addr_a != $wr_addr_b}] - 添加SVA断言(同时可用于仿真验证):
assert property (@(posedge clk) (wr_en_a && wr_en_b) |-> (wr_addr_a != wr_addr_b));
- 使用DC命令:
代码风格优化:在
else块中先写track_vec <= track_vec;,明确默认行为是保持原值,这样代码可读性更强,也更符合综合工具的逻辑识别习惯。
内容的提问来源于stack exchange,提问作者DarinT
相关产品推荐
相关产品推荐

