本章描述了如何开发与Cadence兼容的IEEE 1801代码。
4.1背景
4.2域接口定义
4.3-applies_to的问题
- 当省略时
- 当与-source/-sink一起使用时
- 当与包含端口的-elements一起使用时
4.4 PST与add_power_state
4.5 set_port_attributes
4.6*端口的匿名电源
4.7 set_isolation、set_level_shifter和set_repeater的优先级规则
4.8尽可能避免使用已弃用/旧的命令/选项
4.9其他指南
4.1 背景
遵循这些指南,可以开发易于工具处理的IEEE 1801代码,额外的好处是使电源意图更具可移植性。请注意,本文档假定读者熟悉IEEE 1801的基本语法和语义;它不是教程或IEEE 1801语言的指南。
与IEEE 1801标准相关的有三份工业文档。为方便起见,本章将它们称为LRM1、LRM2和LRM2.1(LRM代表语言参考手册)。
LRM1(Accellera Unified Power Format Standard, Version 1.0, 2007,也简称为UPF 1.0):这种语言不是IEEE 1801标准的一部分,但是IEEE 1801标准的基础。
LRM2(IEEE 1801-2009 Standard for Design and Verification of Low Power Integrated Circuits,也称为UPF 2.0):这是IEEE标准协会在2009年制定和实施的最初的低功耗标准。
LRM2.1(IEEE 1801-2013 Standard for Design and Verification of Low Power Integrated Circuits,也称为UPF 2.1):这是2013年对IEEE低功耗标准的更新。
通常,命令和选项从LRM1发展到LRM2,再到LRM2.1。可以通过发出upf_version命令来指定要使用的版本,值1.0、2.0和2.1分别对应LRM1、LRM2和LRM2.1。
严格来说,尽管每个标准都有演变、历史和相似性,但三个LRM定义了三种不同的语言——向后兼容性没有得到维护,某些命令和选项已被弃用。从理论上讲,工具是基于1801 2013标准构建的;然而,情况并非总是如此。如果支持1801-2013标准,也应该能够成功使用其大多数命令和选项与之前的任何语言。总结来说,工具的策略在语法和语义上可以描述为:
语法上:大多数工具支持所有三种语言。注意,这个说法在概念上是正确的。实际上,所有语言中都有些命令和选项不受支持,甚至某些工具对LRM的整体支持可能有限。使用upf_version命令验证版本和语法,当撰写设计时。否则,请咨询支持IEEE 1801的那些工具的产品手册以获取更多信息。
语义上:如果工具遵循LRM2.1,它可能会忽略upf_version命令,根据某些规则。
如果LRM1和LRM2中可用的命令与LRM2.1中的命令具有相同的语义,命令应该按预期工作。这种情况代表了大多数情况。
如果LRM1和LRM2中可用的命令与LRM2.1中的命令具有不同的语义,应该了解差异并控制、避免或认识已更改的内容。
1. 控制:当差异是一个重要的需要保留的差异时,工具提供了一个专有属性,可以直接控制。
示例(详见“域接口定义”部分):
域接口在所有三种语言中的定义不同。要控制使用哪种定义,可以发出以下命令:set_design_attributes –elements . –attribute {domain_interface_def xyz}
对于此属性,xyz可以是"1.0"、"2.0"或"2.1"。
2. 避免:当有一种方法可以掩盖差异,因此完全避免差异时,应该始终这样做。
示例(详见"-applies_to的问题"部分中的"When absent"):
set_level_shifter命令中的-applies_to选项不是强制性的。当省略时,默认值在LRM1中是both,在LRM2中是outputs,在LRM2.1中是none。工具建议始终在所有set_level_shifter命令中指定它,从而始终避免并掩盖这种差异。
3. 认识:当某些语义根本不合理时,应该认识到它们并忽略它们。
示例(详见"-applies_to的问题"部分中的"When used with -source/-sink"):
在LRM2中,set_isolation存在以下限制:
"如果与-source和/或-sink一起指定-applies_to,应该是一个错误。"
这个限制没有意义,并在LRM2.1中被移除。工具忽略这一点,只遵循LRM2.1。
在本文档的其余部分,每一节都讨论了这三种语言中语义差异的一个方面。在每一节的开头,提供了简洁的简短指南作为快速参考。
产品命令和选项支持
请参阅本文档的"IEEE 1801命令支持表"部分,了解各个产品命令和选项的支持情况。BNF命令显示所有LRM选项。
4.2 域接口定义
指南:(如果需要)使用 `set_design_attributes –elements –attribute {domain_interface_def <1.0/2.0/2.1>}` 来控制域接口的定义。
IEEE 1801中许多命令的语义都建立在域接口的概念之上。
域接口的定义在三个LRM中各不相同。详情请参阅LRM。简要总结如下:
1. 在LRM1中:没有明确定义。然而,行业中的常见做法是只包括边界端口的"lowConn"端。
2. 在LRM2(第89页)中:包括边界端口的"lowConn"和"highConn"两端。
3. 在LRM2.1(第6页)中:包括边界端口的"lowConn"和"highConn"两端,加上宏实例上的端口,这些端口具有与连接的供电集不同的相关供电集。
例如,以下命令:
set_isolation iso1 –domain PD1 –applies_to outputs ...
在LRMs的三种解释下,可能会选择三组不同的目标端口。为了设置一个理想的选择,发出以下`set_design_attributes`命令:
set_design_attributes –elements . –attribute {domain_interface_def xyz}
其中xyz可以是:
1. 字符串"1.0",对应于上述LRM1的要点。
2. 字符串"2.0",对应于上述LRM2的要点。
3. 字符串"2.1",对应于上述LRM2.1的要点(这个值可能不是所有工具都支持)。
`set_design_attributes`命令将工具专有属性`domain_interface_def`与当前作用域关联。该命令可以出现在1801文件的任何位置,设置在整个运行过程中有效。换句话说,此命令不依赖于顺序,可以在任何作用域中发出。如果存在此属性的多个设置,则属性的值必须相同。
如果不设置此属性,则默认值取决于输入1801文件中指定的`upf_version`命令:
- 如果所有1801输入文件中`upf_version`的最低值为"1.0",则此属性的值为"UPF"。
- 如果所有1801输入文件中`upf_version`的最低值为"2.0",则此属性的值为"1801-2009"。
- 如果所有文件中`upf_version`的最低值为"2.1",目前尚不支持,但当支持准备好后,此属性的值将为"1801-2013"。
- 如果输入的1801文件不包含`upf_version`命令,则属性默认为"1801-2009"。
4.3 -applies_to的问题
指南:
1. 在`set_isolation`和`set_level_shifter`中始终明确指定`-applies_to`。
2. 始终将`-applies_to`视为一个过滤器,没有例外。
`set_isolation`和`set_level_shifter`命令都有`-applies_to`选项,它作为候选端口的过滤器。接下来的三个子部分讨论了与`-applies_to`有关的问题。
4.3.1 当省略时
当在`set_isolation`或`set_level_shifter`命令中省略`-applies_to`选项时,LRMs有不同的默认值:
1. LRM1:`set_isolation`为"outputs";`set_level_shifter`为"both"。
2. LRM2:`set_isolation`和`set_level_shifter`都为"outputs"。
3. LRM2.1:`set_isolation`和`set_level_shifter`没有默认值。
例如,在以下命令中:
set_level_shifter ls1 –domain PD1
省略了`-applies_to`选项。在三个LRMs中,这个命令假定有不同的`-applies_to`值。这意味着在不同的解释下,同一个命令将有不同的行为。为了使1801代码更具可移植性,并消除潜在的不匹配解释,工具建议始终明确指定`-applies_to`选项。
4.3.2 当与-source/-sink一起使用时
在LRM2(第93页)中,`set_isolation`命令有以下限制:
"如果与-source和/或-sink一起指定-applies_to,则应报错。"
这个限制是没有道理的,因为-source和-sink选项都是过滤器,它们在不同于-applies_to的方面起作用。有些工具忽略了这个限制。
4.3.3 当与包含端口的-elements一起使用时
在LRM1(第49页)中,`set_isolation`在-elements和-applies_to之间有以下限制:
"如果-elements通过名称直接指定了一个端口(而不是通过指定端口的实例或该实例的祖先来间接指定),那么隔离策略应适用于该端口,不管该端口的模式是否与-applies_to选项指定的模式相匹配。"
这基本上意味着,如果-elements包含一个端口名称,那么-applies_to对那个端口没有效果。在LRM2中,有不同的术语但语义相似。在LRM2.1中没有这样的限制。
工具遵循LRM2.1的语义。也就是说,无论在-elements中如何指定候选端口,-applies_to总是被尊重。这是一个更好的做法,因为-applies_to可以是一个真正的过滤器,没有例外(尽管当-elements列表返回find_objects命令的值时,可能会出现一个潜在的意外情况)。
4.4 PST与add_power_state
指南:使用PST流程指定合法模式。
在指定设计合法电源模式时,有两种流程:PST(电源状态表)流程和add_power_state流程。
1. LRM1描述了PST流程,基本上由以下命令组成:add_port_state、create_pst和add_pst_state。
2. LRM2引入了add_power_state流程,它应该能够替代PST流程,尽管PST流程仍然是LRM2的一部分。
3. LRM2.1对add_power_state命令的语法进行了修订,并且进一步将PST标记为已弃用。
在本文档撰写之时,并非所有的工具都支持add_power_state命令。因此,目前推荐使用PST。然而,从长远来看,工具将推荐使用add_power_state命令,使用LRM2.1中的语法。毕竟,正确使用add_power_state可以提高用户的抽象级别,特别是减轻RTL设计师处理物理网络的负担(正如PSTs所面临的情况)。
Xcelium
SimVision或Tcl不支持add_power_state命令。
4.5 set_port_attributes
指南:对于set_port_attributes命令,
1. 只使用下面列出的支持选项。
2. 避免使用非标准命令set_related_supply_net,除非你正在使用UPF 1.0。
set_port_attributes命令有大量的选项。在本文档撰写之时,工具推荐你只使用以下选项:
- –ports(如果需要,还包括–exclude_ports)
- –elements
- –applies_to(LRM2.1的语法)
- –driver_supply或–receiver_supply
使用这些选项,这个命令可以用来关联顶层端口的驱动器或接收器供电集,这是该命令最重要的应用之一。例如:
set_port_attributes –ports {in1 in2} –driver_supply ss1
使用此命令设置顶层端口in1和in2的外部驱动供电集为ss1。
工具将在未来的版本中支持其他选项,但只有使用LRM2.1中描述的语法。这是因为:
1. LRM1中没有这个命令。
2. LRM2中描述的语法有些笨拙和令人困惑,特别是–applies_to的不同用法。工具不计划支持这些,甚至不是在语法上。
还要注意,由于这个命令在LRM1中不存在,如果用户正在编写UPF 1.0文件,没有官方的方式来关联顶层端口的供电。为了弥补这个缺陷,通常使用非标准的命令set_related_supply_net作为行业实践。工具不鼓励使用这样的非标准命令。然而,为了支持用UPF 1.0编写的旧版IP,工具确实支持这个命令。
4.6 顶层端口的匿名供电
指南:始终为顶层端口关联供电集。
前一节(关于set_port_attributes)描述了如何将供电集与顶层端口关联。如果用户在顶层端口上没有指定这种关联会发生什么?
1. 在LRM1和LRM2中,这种特定情况没有被解决,因此语义不明确。
2. 在LRM2.1中,一个不等同于任何用户定义供电的匿名供电隐式地与顶层端口关联。
工具建议始终显式地为每个顶层端口关联供电集(见前一节了解详细信息)。没有这种关联,电源意图通常是不完整的,软件可能会生成错误。工业界的其他工具假设所有顶层端口隐式地与顶层模块电源域的主供电关联。这种行为没有LRM基础,容易出错。工具不推荐这种行为;然而,为了增加对旧版IP的兼容性,Cadence提供了一个专有属性,可以使用它来控制这种行为。可以使用以下命令设置此属性:
set_design_attributes –elements . –attribute {top_ports_have_anon_supply <0/1>}
Cadence专有属性`top_ports_have_anon_supply`取值为0或1,其中1通常是默认值。对于使用多个1801文件的设计,此属性的值取决于指定的最低upf_version。例如:
- 如果多个1801文件中的最低upf_version是1.0或2.0,该值是0。
- 如果多个1801文件中的最低upf_version是2.1,该值是1。
用户始终可以发出显式命令来覆盖默认值;然而,请注意,指南始终是将顶层端口关联到供电集。不关联或依赖专有属性将创建不可移植的1801代码。
4.7 set_isolation、set_level_shifter和set_repeater的优先级规则
指南:
1. 避免依赖于LRM2中所述的-source和-sink具有更高的优先级。
2. 避免依赖于LRM2.1中所述的位扩展端口具有更高的优先级。
在set_isolation、set_level_shifter或set_repeater命令中,目标端口可能适用于多个此类命令。然后由优先级规则确定该目标端口应采取哪个策略。LRMs的优先级规则如下:
1. 在LRM1中,没有说明。
2. 在LRM2(第21页):
a. 直接UPF命令。通过明确的UPF命令引用设计对象来应用电源意图。
b. 应用于父级的电源意图由每个子级继承,并递归应用于后代,除非有直接的UPF命令适用。
c. 使用-source和-sink选项指定的策略。
d. 使用-source或-sink指定的策略。
3. 在LRM2.1(第44页):
a. 明确按名称指定的多位端口部分的命令。
b. 明确按名称指定的整个端口的命令。
c. 明确按名称指定的实例的所有端口的命令。
d. 明确指定给定方向的指定电源域的所有端口的命令。
e. 明确指定的电源域的所有端口的命令。
比较这两组不同的优先级规则后的一些观察结果:
观察A:"更具体的规则获胜"的一般理念是相同的(2a、2b与3c、3d和3e)。
观察B:LRM2给-source和-sink更高的优先级(2c和2d)。
观察C:LRM2.1给位扩展端口更高的优先级(3a和3b)。
为了在优先级规则方面实现最大的可移植性,Cadence建议用户只依赖于两个LRMs之间共享的共同理念(即上述观察A)。换句话说,用户应该:
避免依赖于-source和-sink具有更高的优先级(观察B)
避免这一点,因为这不是LRM2.1中的内容。
避免依赖于位扩展端口具有更高的优先级(观察C)
不仅因为这不是LRM2中的内容,而且因为find_objects可能或可能不返回位扩展端口名称。
请注意,优先级规则仅用于提高便利性,因为这些命令中有足够的结构,理论上可以使所有策略具有不相交的目标端口,从而完全避免应用这些规则。通过便利性的权衡,可以提高可移植性。
例如,假设端口p适用于以下两个策略:
set_isolation iso1 –domain PD1 –sink SS2 ...
set_isolation iso2 –domain PD1 ...
在LRM2的优先级规则下,策略iso1具有更高的优先级(因为存在-sink)。
然而在LRM2.1的优先级规则下,两种策略具有相同的优先级。为了提高可移植性,可以通过以下方式添加-elements到iso1:
set_isolation iso1 –domain PD1 –sink SS2 –elements p ...
或者向iso2添加另一个-sink:
set_isolation iso2 –domain PD1 –sink SS3 ...
另一个例子,假设总线q的第2位适用于以下两个策略:
set_isolation iso3 –domain PD1 –elements {q[2]} ...
set_isolation iso4 –domain PD1 –elements {q} ...
在LRM2的优先级规则下,这两个策略具有相同的优先级。然而在LRM2.1的优先级规则下,iso3具有更高的优先级(因为第2位是总线q的特定位)。为了提高可移植性,可以将iso4更改为:
set_isolation iso4 –domain PD1 -elements {q[0] q[1] q[3] }
或者:
set_isolation iso4 –domain PD1 –elements {q} –exclude_elements {q[2]}
无论哪种方式,都会使iso3和iso4具有不相交的目标端口,从而避免不同LRMs的模糊解释。
4.8 尽可能避免使用已弃用/旧的命令/选项
指南:尽可能避免使用已弃用或旧的命令和选项。
LRM2.1将许多命令和选项标记为已弃用或旧版。虽然目前在实践中完全避免使用它们是不可能的,但工具建议在可能的情况下避免使用它们。
一个应该避免使用的已弃用选项的示例是在使用set_isolation和set_level_shifter时的-location选项:
- 在LRM2中,-location的可能值包括self、other、parent、automatic、fanout、fanin、faninout和sibling。
- 在LRM2.1中,上述最后三个值被标记为已弃用。用户应避免使用这些已弃用的值。
目前仍无法避免使用的命令示例是用于定义PSTs(电源状态表)的命令。有关更多详细信息,请参阅“PST与add_power_state”部分。
Xcelium
由于历史原因,IES支持许多上述UPF 1.0命令和选项。有关详细信息,请参阅Xcelium低功耗仿真IEEE 1801文档。
4.9 其他指南
1. 在set_isolation和set_level_shifter中始终指定-location。避免使用在LRMs中不同的默认值。