VCS带UPF的RTL低功耗仿真介绍

文章目录

  • 前言
  • 一、UPF文件是什么
    • 1.电源域(power_domain)
    • 2.电源开关(power_switch)
    • 3.电源隔离(power_isolation)
    • 4. 其他
  • 二、如何快速上手
    • 1.学习VCS自带的demo
    • 2.启动带UPF的仿真
    • 3.debug带UPF的仿真
  • 总结


前言

最近在做VCS带UPF文件的低功耗仿真,把这个上手的过程,以及要注意的事项记录一下。


一、UPF文件是什么

UPF(Unified Power Format)文件主要用来描述RTL代码的供电情况。在UPF文件中,描述RTL中的电源域(power_domain)、电源开关(power_switch)以及电源隔离(power_isolation)等。简单的说,在UPF文件里边,通过代码来描述,整颗芯片中,不同RTL层次结构的供电关系。

1.电源域(power_domain)

电源域用来逻辑区分不同的供电模块。
create_power_domain命令定义一个电源域,通常用于电源域中的设计元素列表。电源域是一个或多个电源设计元素的逻辑分组。一个电源域应具有一个电源和地。

2.电源开关(power_switch)

电源开关用来打开或者关闭电源域。
create_power_switch命令在电源域中定义电源开关实例。电源开关在电源域的范围内创建。电源开关只有开或者关两种状态。

3.电源隔离(power_isolation)

电源隔离主要用于不同的电源域之间,其中一个电源域断电后,不对另外一个电源域造成影响。主要是将断电后电源域的输出信号钳位到高或者低电平,防止掉电后的叉态传播。
set_isolation和set_isolation_control命令确定要隔离哪些端口,以及在逻辑层次结构中创建产生的隔离单元的位置。

4. 其他

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可以用来关断输出电压。

二、如何快速上手

1.学习VCS自带的demo

VCS工具自带了一个UPF仿真的demo供学习,具体的路径在$VCS_HOME/doc/examples/NLP/MVSIM_NATIVE_DEMO。
demo的介绍可以参考如下文章:
VCS自带的UPF低功耗仿真demo介绍

2.启动带UPF的仿真

要启动一个带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、加入编译选项。
加入的编译选项如下:

  • +define+UPF :定义UPF的宏;
  • -upf upf_filename.upf :导入UPF文件(irun中的选项是 - upf_1801);
  • -power_top TOP:指定UPF供电的顶层。这一条也可以在UPF文件中进行指定。

3、在顶层导入UPF库并供电
在顶层可以加入如下代码:

`ifdef UPF
	import UPF::*;
	initial beign
		supply_on("VDD", 1.1);
		supply_on("GND", 0);
	end
`endif

3.debug带UPF的仿真

在跑带UPF文件的RTL仿真时,一开始将UPF全部写完去仿真,结果仿真一下就卡死了,卡死的现象是不管等多久,仿真始终停在某一个状态,而且仿真时间不往前走,查看log文件也找不到问题所在。
最后解决的办法是,一开始将所有电源域的电都供上,再一个一个去加入电源开关和电源隔离,加一个跑一下,仿真过了再加下一个,最终解决问题。


总结

本文主要介绍了如何利用VCS,进行带UPF的RLT低功耗仿真。主要的内容都是入门级需要了解和注意的,并没有涉及到深入的低功耗分析。

你可能感兴趣的:(随笔,vcs,UPF,低功耗)