☰
Design Compiler:(库)引脚对象的is_**_pin属性
2026/10/11 1:37:58 网站建设 项目流程

相关阅读

Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm=1001.2014.3001.5482


不管是库引脚对象还是引脚对象,都有一系列is_**pin属性用于表示其类型,例如is_clock_pin、is_data_pin、is_clear_pin、is_preset_pin、is_async_pin、is_fall_edge_triggered_clock_pin、is_rise_edge_triggered_clock_pin、is_fall_edge_triggered_data_pin、is_rise_edge_triggered_data_pin、is_negative_level_sensitive_clock_pin、is_positive_level_sensitive_clock_pin、is_negative_level_sensitive_data_pin、is_positive_level_sensitive_data_pin等

本文将举例说明这些属性的取值情况。

时钟引脚类属性

is_clock_pin、is_fall_edge_triggered_clock_pin、is_rise_edge_triggered_clock_pin、is_negative_level_sensitive_clock_pin、is_positive_level_sensitive_clock_pin这五个属性属于时钟引脚类属性。

对于通用时序单元(SEQGEN),其enable引脚(用于锁存器)和clocked_on引脚(用于触发器)的时钟引脚类属性可能为true;对于库引脚,如果其库引脚属性clock为true,其时钟引脚类属性可能为true;对于引脚,如果其对应的库引脚属性clock为true,其时钟引脚类属性可能为true。

is_clock_pin属性是范围最大的时钟引脚类属性,满足上述条件即可能为true;is_fall_edge_triggered_clock_pin属性在此基础上,还要求为下降沿触发的时钟引脚,才可能为true;is_rise_edge_triggered_clock_pin属性在此基础上,还要求为上升沿触发的时钟引脚,才可能为true;is_negative_level_sensitive_clock_pin在此基础上,还要求为低电平触发的时钟引脚,才可能为true;is_positive_level_sensitive_clock_pin在此基础上,还要求为高电平触发的时钟引脚,才可能为true。

上面只说了可能为true,这是因为如果由于set_disable_timing命令、set_case_analysis命令、固定值引起的常量传播、工具自动断开组合逻辑环(Timing Loop)和状态相关的时序弧(Conditional Timing Arc)缺少对应状态等原因,导致时钟引脚到所有数据输入端(同步复位/置位/使能端被视为数据输入)的约束类时序弧和时钟引脚到所有数据输出端的延迟类时序弧失效,其时钟引脚类属性为false。

关于时序弧失效的更多内容,可以参考下面的博客。

SDC命令详解:使用set_disable_timing命令进行约束https://blog.csdn.net/weixin_45791458/article/details/136463216?sharetype=blogdetail&sharerId=136463216&sharerefer=PC&sharesource=weixin_45791458&spm=1011.2480.3001.8118SDC命令详解:使用set_case_analysis命令进行约束https://blog.csdn.net/weixin_45791458/article/details/136405802?ops_request_misc=elastic_search_misc&request_id=7b57386b0d63ce0e63333a2f741a0cd7&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~ElasticSearch~search_v2-1-136405802-null-null.541^v3^pc_search_result_blog1&utm_term=set_case_analysis&spm=1018.2226.3001.4450关于时序弧的更多内容,可以参考下面的博客。

Library Compiler:时序弧建模与约束全解析(一)https://blog.csdn.net/weixin_45791458/article/details/155918818?ops_request_misc=elastic_search_misc&request_id=b9c608946a301476b980e699d11534cf&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~ElasticSearch~search_v2-2-155918818-null-null.541^v3^pc_search_result_blog1&utm_term=%E5%BB%B6%E8%BF%9F%E6%97%B6%E5%BA%8F%E5%BC%A7&spm=1018.2226.3001.4450

数据引脚类属性

is_data_pin、is_fall_edge_triggered_data_pin、is_rise_edge_triggered_data_pin、is_negative_level_sensitive_data_pin、is_positive_level_sensitive_data_pin这五个属性属于数据引脚类属性。

对于通用时序单元(SEQGEN),其data_in引脚(用于锁存器)和next_state、synch_clear、synch_preset、synch_enable、synch_toggle引脚(用于触发器)的数据引脚类属性可能为true;对于库引脚,如果其库引脚属性clock不为true(或没有该属性)且没有在ff组的clear属性、preset属性中指定,其数据引脚类属性可能为true;对于引脚,如果其对应的库引脚属性clock不为true(或没有该属性)且没有在ff组的clear属性、preset属性中指定,其数据引脚类属性可能为true。

is_data_pin属性是范围最大的数据引脚类属性,满足上述条件即可能为true;is_fall_edge_triggered_data_pin属性在此基础上,还要求为下降沿触发的数据引脚,才可能为true;is_rise_edge_triggered_data_pin属性在此基础上,还要求为上升沿触发的数据引脚,才可能为true;is_negative_level_sensitive_data_pin在此基础上,还要求为低电平触发的数据引脚,才可能为true;is_positive_level_sensitive_data_pin在此基础上,还要求为高电平触发的数据引脚,才可能为true。

上面只说了可能为true,这是因为如果由于set_disable_timing命令、set_case_analysis命令、固定值引起的常量传播、工具自动断开组合逻辑环(Timing Loop)和状态相关的时序弧(Conditional Timing Arc)缺少对应状态等原因,导致时钟引脚到数据输入端(同步复位/置位/使能端被视为数据输入)的约束类时序弧失效,其数据引脚类属性为false。

异步复位/置位引脚类属性

is_async_pin、is_clear_pin、is_preset_pin这三个属性属于异步复位/置位引脚类属性。

对于通用时序单元(SEQGEN),其preset、clear引脚(用于触发器和锁存器)的异步复位/置位引脚类属性为true(在Design Compiler中实测似乎一直为false,疑似为bug);对于库引脚,如果其库引脚属性clock不为true(或没有该属性)且在ff组的clear属性、preset属性中指定,其异步复位/置位引脚类属性为true;对于引脚,如果其对应的库引脚属性clock不为true(或没有该属性)且在ff组的clear属性、preset属性中指定,其异步复位/置位引脚类属性为true。

is_async_pin属性是范围最大的异步复位/置位引脚类属性,满足上述条件即为true;is_clear_pin属性在此基础上,还要求为异步复位引脚,才为true;is_preset_pin属性在此基础上,还要求为异步置位引脚,才为true。

这里与时钟引脚类和数据引脚类属性不同的是,即使由于set_disable_timing命令、set_case_analysis命令、固定值引起的常量传播、工具自动断开组合逻辑环(Timing Loop)和状态相关的时序弧(Conditional Timing Arc)缺少对应状态等原因,导致时钟引脚到异步复位/置位端的约束类时序弧失效或异步复位/置位端到数据输出端的延迟类时序弧失效,其异步复位/置位引脚类属性依旧为true。

特殊情况

下面列举出一些特殊情况下的is_**pin属性的取值,尚不清楚这是否工具bug,这些现象只会在通用时序单元上发生。

通用时序单元的失效时序弧

对于通用时序单元的enable、clocked_on引脚,无法使用set_case_analysis命令让约束类时序弧和延迟类时序弧失效,只能用依靠固定值引起的常量传播和set_disable_timing命令强行断开。

下面的图1以一个带异步复位的通用时序单元为例进行说明。

图1 带异步复位的通用时序单元

// 问题现象 dcnxt_shell> set_case_analysis 1 [get_ports clk] 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin Warning: Attribute 'is_clock_pin' does not exist on pin 'data_reg_reg/clocked_on'. (UID-101) dcnxt_shell> get_attribute [get_pins data_reg_reg/next_state] is_data_pin Warning: Attribute 'is_data_pin' does not exist on pin 'data_reg_reg/next_state'. (UID-101) dcnxt_shell> update_timing // 如果不用该命令,属性不会创建或更新 Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/next_state] is_data_pin true
// 情况一 dcnxt_shell> set_logic_one [get_ports clk] 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin false dcnxt_shell> get_attribute [get_pins data_reg_reg/next_state] is_data_pin false
// 情况二 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_clear] is_data_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_preset] is_data_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_toggle] is_data_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_enable] is_data_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/next_state] is_data_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin true dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to next_state 1 dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to Q 1 dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to QN 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin true dcnxt_shell> get_attribute [get_pins data_reg_reg/next_state] is_data_pin false dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to synch_clear 1 dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to synch_preset 1 dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to synch_toggle 1 dcnxt_shell> set_disable_timing [get_cells data_reg_reg] -from clocked_on -to synch_enable 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_clear] is_data_pin false dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_preset] is_data_pin false dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_toggle] is_data_pin false dcnxt_shell> get_attribute [get_pins data_reg_reg/synch_enable] is_data_pin false dcnxt_shell> get_attribute [get_pins data_reg_reg/clocked_on] is_clock_pin false

情况二进一步表明,对于作为触发器使用的通用时序单元的next_state、synch_clear、synch_preset、synch_enable、synch_toggle引脚,无法使用set_case_analysis命令和固定值引起的常量传播让约束类时序弧失效,只能用依靠set_disable_timing命令强行断开(或是从时钟引脚断开约束类时序弧,如情况一所示,就像其data_in引脚那样);作为锁存器使用的通用时序单元的data_in引脚同理,无法使用set_case_analysis命令和固定值引起的常量传播让约束类时序弧失效,其next_state、synch_clear、synch_preset、synch_enable、synch_toggle引脚是因为时钟引脚clocked_on才断开了约束类时序弧。

跨层次通用时序单元的失效时序弧

上一节说到,对于通用时序单元的enable、clocked_on引脚,无法使用set_case_analysis命令让约束类时序弧和延迟类时序弧失效,只能用依靠固定值引起的常量传播和set_disable_timing命令强行断开,但其实依靠固定值引起的常量传播也是有前提的,要求常量不能跨层次传播。

下面的图2以一个有层次的带异步复位的通用时序单元为例进行说明。

图2 有层次的带异步复位的通用时序单元

// 问题现象 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/clocked_on] is_clock_pin true dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/enable] is_clock_pin false dcnxt_shell> set_logic_one [get_ports clk] 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/clocked_on] is_clock_pin true dcnxt_shell> disconnect_net [get_nets u_sub_module/*Logic0*] [get_pins u_sub_module/data_reg_reg/enable] Disconnecting net 'u_sub_module/*Logic0*' from pin 'u_sub_module/data_reg_reg/enable'. 1 dcnxt_shell> connect_net [get_nets u_sub_module/clk] [get_pins u_sub_module/data_reg_reg/enable] Connecting net 'u_sub_module/clk' to pin 'u_sub_module/data_reg_reg/enable'. 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/enable] is_clock_pin true dcnxt_shell> ungroup [get_cells u_sub_module] 1 Current design is 'top_wrapper'. dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/clocked_on] is_clock_pin false dcnxt_shell> get_attribute [get_pins u_sub_module/data_reg_reg/enable] is_clock_pin false

一开始,由于enable引脚受到层次内的固定值引起的常量传播影响,其is_clock_pin属性为false,但是如果在外部将clk端口连接到固定值,clocked_on引脚的is_clock_pin属性依旧为true,与上一节的情况一不同,接着用网表编辑命令,将enable引脚与clocked_on引脚连接到一起,enable引脚的is_clock_pin属性也变成了true,最后使用ungroup命令解组,enable引脚与clocked_on引脚又重新连接到同一层次下的固定值,因此它们的is_clock_pin属性又变回了false。

跨层次连接到同一线网的通用时序单元的失效时序弧

如果一个通用时序单元的enable、clocked_on引脚在当前层次连接到固定值,但固定值又连接到更低层次中的时序单元(不要求其为通用时序单元)的时钟引脚,其约束类时序弧和延迟类时序弧不会失效,即is_clock_pin属性为true,图3展示了这种情况。

图3 跨层次连接到同一线网的通用时序单元

// 问题现象 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins q_dff_reg/clocked_on] is_clock_pin true dcnxt_shell> disconnet_net [get_nets clk] [get_pins u_test1/clk] Disconnecting net 'clk' from pin 'u_testl/clk'. 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins q_dff_reg/clocked_on] is_clock_pin false

如果一个通用时序单元的enable、clocked_on引脚在当前层次连接到固定值,但固定值又连接到更高层次中的时序单元(不要求其为通用时序单元)的时钟引脚,其约束类时序弧和延迟类时序弧会失效,即is_clock_pin属性为false,同时更高层次中如果是通用时序单元,其约束类时序弧和延迟类时序弧也会失效,即is_clock_pin属性为false,图4展示了这种情况。

图4 跨层次连接到同一线网的通用时序单元

// 问题现象 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins q_dff_reg/clocked_on] is_clock_pin false dcnxt_shell> get_attribute [get_pins u_test1/q_latch1_reg/clocked_on] is_clock_pin false dcnxt_shell> disconnet_net [get_nets q_latch1] [get_pins u_test1/q_latch1] Disconnecting net 'q_latch1' from pin 'u_test1/q_latch1'. 1 dcnxt_shell> update_timing Information: Updating design information... (UID-85) 1 dcnxt_shell> get_attribute [get_pins q_dff_reg/clocked_on] is_clock_pin true dcnxt_shell> get_attribute [get_pins u_test1/q_latch1_reg/clocked_on] is_clock_pin false

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询