相关阅读
Design Compiler
https://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482
在Design Compiler中使用compile或compile_ultra命令进行综合时,可以指定-exact_map选项,此时Design Compiler将进行精确映射。
当读取RTL设计时,Design Compiler内置的HDL Compiler将设计转化为通用时序单元SEQGEN(或者称为Generic/Unmapped Sequential Cell)和GTECH单元(或者称为Generic Technology Cell)、可综合操作符等组成的网表,如例1和图1所示。
// 例1
module simple_register (
input clk,
input rst_n,
input d,
output reg out
);
always @(posedge clk) begin
if (~rst_n) begin
out <= 0;
end else begin
out <= d;
end
end
endmodule

图1 通用时序单元和GTECH单元组成的网表
如果不使用-exact_map选项进行综合,Design Compiler会根据设计的实际情况,在将通用时序单元映射到具体的触发器或锁存器,并可能在考虑与之连接的GTECH单元的情况下,将部分组合逻辑功能融入触发器或锁存器的功能。图2和图3都有可能是例1的综合结果。

图2 例1的一种综合结果(非精确映射)

图3 例1的一种综合结果(非精确映射)
图3所示的综合结果使用了带同步复位端的触发器代替了图2中数据输入端前的数据选择器功能。
如果使用-exact_map选项进行综合,Design Compiler在进行映射时不会将与通用时序单元连接的GTECH单元考虑在内,配合sync_set_reset、sync_set_reset_local、sync_set_reset_all等综合指令一起使用,能使综合结果更加可预测,如下所示。
// 例2
module simple_register (
input clk,
input rst_n,
input d,
output reg out
);
// synopsys sync_set_reset "rst_n"
always @(posedge clk) begin
if (~rst_n) begin
out <= 0;
end else begin
out <= d;
end
end
endmodule

图4 通用时序单元和GTECH单元组成的网表
精确映射的结果是一个带同步复位端的触发器,如图5所示。

图5 例2的一种综合结果(精确映射)
但是,即使使用了精确映射,也无法保证引脚不交换。以例1为例,其触发器的下一状态方程为,如果令d为1,则
,此时可以令
,也就是说,把
重新映射为
,如图6所示。

图6 例1的一种综合结果(精确映射)
下面有几点需要注意。
1、使用精确映射不代表无法使用单元的反向输出引脚(QN),因为通用时序单元也有反向输出引脚(QN)。
2、精确映射会让Design Compiler在进行时序映射时更加保守,这可能会降低结果质量(QoR)。
3、如果使用了精确映射(-exact_map选项),综合时会自动禁止相位反转(Phase Inversion),即自动使用-no_seq_output_inversion选项选项,此时不允许Design Compiler将反相器移动并穿过寄存器边界。
4、如果在使用精确映射(-exact_map选项)的同时,启动了门控时钟优化(-gate_clock选项),对于那些参与时钟门控优化的寄存器,工具可能无法遵守精确映射的要求。