最近在做VCS带UPF文件的低功耗仿真,把这个上手的过程,以及要注意的事项记录一下。
UPF(Unified Power Format)文件主要用来描述RTL代码的供电情况。在UPF文件中,描述RTL中的电源域(power_domain)、电源开关(power_switch)以及电源隔离(power_isolation)等。简单的说,在UPF文件里边,通过代码来描述,整颗芯片中,不同RTL层次结构的供电关系。
电源域用来逻辑区分不同的供电模块。
create_power_domain命令定义一个电源域,通常用于电源域中的设计元素列表。电源域是一个或多个电源设计元素的逻辑分组。一个电源域应具有一个电源和地。
电源开关用来打开或者关闭电源域。
create_power_switch命令在电源域中定义电源开关实例。电源开关在电源域的范围内创建。电源开关只有开或者关两种状态。
电源隔离主要用于不同的电源域之间,其中一个电源域断电后,不对另外一个电源域造成影响。主要是将断电后电源域的输出信号钳位到高或者低电平,防止掉电后的叉态传播。
set_isolation和set_isolation_control命令确定要隔离哪些端口,以及在逻辑层次结构中创建产生的隔离单元的位置。
set_scope用来定位当前scope,表明UPF command应该在hierarchy中的哪个位置执行。
set_scope A_CHIPTOP/
set_design_top用来联系UPF和design module,该UPF将应用到每个由该module例化的instance。
port和net的区别:port是指module的接口,连接相邻的hierarchy,而net是module内部的,连接各个port。
power domain:在物理上,同一个power domain的instance会放在一起,并由相同的电源供电。power domain定义时,一般会指定该处在domain的最高层instance。子instance的默认domain跟它的上层instance一致。子instance如果处在不同的domain, 需要显式地从该domain中移除,或者在对应的domain中指定。
isolation的作用是,防止大电流损害电路,以及防止不定态影响电路逻辑。isolation cell有两种模式:normal模式,作用类似buffer,isolation模式,输出(clamp)一个特定值。模式通过isolation enable信号来选择。isolation cell 可放在power domain的input或者output。
如果两个相邻的power domain电压不一样,需要用到level-shifter。
isolation和level-shifter功能通常放在同一个cell里面。
add_power_state 与 create_pst/add_pst_state combination的作用类似,都用来指定power状态信息。
create_power_switch的作用是插入一个switch可以用来关断输出电压。
VCS工具自带了一个UPF仿真的demo供学习,具体的路径在$VCS_HOME/doc/examples/NLP/MVSIM_NATIVE_DEMO。
demo的介绍可以参考如下文章:
VCS自带的UPF低功耗仿真demo介绍
要启动一个带UPF的仿真首先需要写好RLT前仿的测试用例,其次,需要具备几个条件:(1)写好UPF文件;(2)加入编译选项;(3) 在顶层导入UPF库并供电。
1、写好UPF文件
写UPF文件之前,要对整个芯片的供电方案有一个全局的了解,自顶向下的方式,挨个电源域的方式去写。
写UPF时要注意initial块的执行。
initial语句,是在仿真的0时刻开始执行。如果模块是在仿真非0时刻上电,那么上电之后,initial语句,是不会执行的。
在VCS中,需要在UPF中打开SNPS_reinit属性,来确保上电后执行initial块。
set_design_attributes -attribute SNPS_reinit TRUE
在irun中,需要加入set_sim_control命令来控制。具体可以参考如下链接:
https://aijishu.com/a/1060000000119148
2、加入编译选项。
加入的编译选项如下:
3、在顶层导入UPF库并供电
在顶层可以加入如下代码:
`ifdef UPF
import UPF::*;
initial beign
supply_on("VDD", 1.1);
supply_on("GND", 0);
end
`endif
在跑带UPF文件的RTL仿真时,一开始将UPF全部写完去仿真,结果仿真一下就卡死了,卡死的现象是不管等多久,仿真始终停在某一个状态,而且仿真时间不往前走,查看log文件也找不到问题所在。
最后解决的办法是,一开始将所有电源域的电都供上,再一个一个去加入电源开关和电源隔离,加一个跑一下,仿真过了再加下一个,最终解决问题。
本文主要介绍了如何利用VCS,进行带UPF的RLT低功耗仿真。主要的内容都是入门级需要了解和注意的,并没有涉及到深入的低功耗分析。