ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

HDL Compiler:综合指令

HDL Compiler:综合指令 相关阅读HDL Compilerhttps://blog.csdn.net/weixin_45791458/category_12893238.html?spm1001.2014.3001.5482简介综合指令(Synthesis Directives)是一些特殊注释用于影响综合工具如何处理RTL代码这些注释会被综合工具识别但会被其他工具如仿真器忽略。综合指令通常写成注释的形式对于verilog和systemverilog是//或/*对于VHDL是--后面接一个指令头可以是pragma、synopsys、synthesis、$s、$S然后是具体的指令内容允许在指令头和指令内容之间存在空格。需要注意的是并非所有综合指令都支持pragma指令头。下面列出了HDL Compiler支持的所有综合指令对于verilog和systemverilogasync_set_resetasync_set_reset_localasync_set_reset_local_alldc_tcl_script_begin和dc_tcl_script_endenumfull_caseinfer_multibit和dont_infer_multibitinfer_muxinfer_mux_overrideinfer_onehot_muxkeep_signal_nameone_coldone_hotparallel_casepreserve_sequentialsync_set_resetsync_set_reset_localsync_set_reset_local_alltemplatetranslate_off和translate_on不推荐使用对于VHDLkeep_signal_nametemplatetranslate_off和translate_onresolution_methodrp_group和rp_endgrouprp_placerp_fillrp_array_dir使用如果没有必要不建议使用综合指令因为有些指令可能会导致前仿真和后仿真的不一致比如full_case和parallel_case。下面举例说明sync_set_reset指令的用法该指令的语法如下所示。// synopsys sync_set_reset signal_name_listsync_set_reset指令可以使HDL Compiler推导出具有同步置位或复位功能的D触发器在进行综合时通用时序单元SEQGEN将被被映射为逻辑库中带有同步复位/置位引脚的触发器或者使用一个普通D触发器并在其输入引脚前构建同步复位/置位逻辑并尽量保证复位/置位信号尽量贴近触发器。具体使用哪种方式取决于哪种方法在综合中能获得更好的优化结果以及库中是否存在存在具有同步置位或复位功能的D触发器。该指令存在的意义是什么呢相较于异步复位包括异步置位同步复位更难被识别因为不像异步复位那样复位信号出现在敏感列表中有些情况下当同步复位没有被正确识别时可能会导致仿真初始化时出现复位失败的情况。以例1的代码为例假设库中不存在具有同步置位或复位功能的D触发器。// 例1 module ctr8sr ( output reg [7:0] q, output reg co, input [7:0] d, input ld, input clk, input rst_n ); always (posedge clk) if (!rst_n) {co, q} 9b0; else if (ld) {co, q} d; else {co, q} q 1b1; endmodule图1 一种综合结果图2 另一种综合结果综合结果可能如图1所示但也可能生成图2中的电路这个电路在功能上和图1是完全相同的唯一的区别是复位用的与门被移到了多路选择器前。在仿真的起始阶段会发生什么如果让rst_n保持为低电平就可以让MUX两个数据输入端都强制为0但如果此时选择端是x信号那么触发器的输出就会变成x而不会被正确复位。需要注意的是该问题只出现在仿真阶段实际电路会正常工作触发器会正确复位为0。为了解决这个仿真初始化问题Synopsys提供了sync_set_reset综合指令用于显式指明同步复位/置位信号并尽量保证复位/置位信号尽量贴近触发器。例2和例3展示了使用与不使用sync_set_reset综合指令对于HDL Compiler的影响假设库中存在具有同步置位或复位功能的D触发器。// 例2 module simple_register ( input clk, input rst_n, input d, output reg out ); always (posedge clk) begin if (~rst_n) begin out 1; end else begin out d; end end endmodule图3为HDL Compiler读取例2时产生的触发器推断报告可以看出其中并未识别出带有同步置位逻辑的触发器。图3 例2的触发器推断报告图4是例2中SEQGEN单元的表示可以看出其中同步置位引脚直接连接到0。图4 例2的SEQGEN单元表示图5是例2的综合结果可以看出尽管未正确识别出同步置位综合结果仍然实现了同步置位的功能但正如之前所说的这可能会出现问题。图5 例2的综合结果// 例3 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 1; end else begin out d; end end endmodule图6为HDL Compiler读取例3时产生的触发器推断报告可以看出其中并识别出带有同步置位逻辑的触发器。图6 例3的触发器推断报告图7是SEQGEN单元的表示可以看出其中同步置位引脚连接到输入端口rst_n。图7 例3的SEQGEN单元表示图8是例3的综合结果可以看出综合结果是具有同步复位功能的D触发器这是由于输出取反了需要注意的是即使不使用综合指令SEQGEN单元也可能映射为具有同步复位功能的D触发器。图8 例3的综合结果属性Verilog 2001标准推出了一个称为属性的结构用于向工具传递一些非RTL信息在此之前EDA厂商通过注释的方法如本文所说进行传递但这种方法的问题在于EDA工具需要对所有的注释做语法分析以查看注释中是否包含特定工具的指令。图9展示了属性语法的BNF范式。图9 属性的语法将sync_set_reset综合指令转换为属性表示就应该类似下面的形式。(*sync_set_reset rst_n*)但不幸的是Synopsys并不接受用属性传递这些综合命令仅针对systemverilog提供了有限的支持可以通过该语法设置对象的属性就像通过set_attribute命令设置那样。需要注意的是需要将hdlin_sv_enable_rtl_attributes变量默认值为false设置为true才能使用该功能。下面展示了一个将UCORE单元的dont_touch属性设置为true的例子。// 内建属性 (* dont_touch *) core UCORE (.CLK(CLK), ...);
返回列表