原文链接 关于什么是UPF以及电源域等等概念赛宝龙在这里就不多说了,有兴趣的可以查阅IEEE1801-2013标准。
先上低功耗要求,即power intent:顶层模块为TOP,而TOP中例化了一个子模块,其例化名为instA1,具体的代码如下所示:
TOP模块的代码: 顶层TOP 的供电轨道为VDD和VSS,而instA1的供电轨道为VDDA和VSS,并且当VDD掉电后instA1的out1端口也被关掉,out2不受VDD的影响。首先我们编写power intent 文件:
在power intent文件中,我们根据要求创建了两个电源域,并且为电源域指定了供电端口和供电线,并将供电端口和供电线进行连接构成供电网络,而且我们还为两个电源域显式的指定了主供电线网络,最后根据要求,VDD掉电后instA1的out1也将被关掉,这样我们需要为instA1的out1端口指定相对的供电线VDD。
写好了powerintent文件后,我们需要构建测试平台
按照通常的testbench的写法,同时要模拟电源行为,我们使用了supply_on和supply_off函数,这两个函数是upf标准中定义的两个标准库函数,其中supply_on函数接受两个参数:参数一为字符串常量,所取值应该为power intent文件中定义的供电端口名,参数二为电压值。supply_off函数只有一个字符串常量参数。
写好testbench之后,我们需要使用synopsys公司的mvtool和vcs工具进行仿真:与一般的仿真步骤类似,仿真RTL+UPF也可以分为三步模式,不过赛宝龙更喜欢一步到位,具体命令为:
vcsmvsim -debug_all -upf demo.upf -sverilog $ARCHPRO_ROOT/templates/upf_package.sv *.v &
其中ARCHPRO_ROOT应该在你的.cshrc或者.bashrc中设置为环境变量,指向你的mvtool安装的根路径。
执行上述命令,编译无误后,用dve观察仿真结果为:
由仿真图可以看到instA1的out1有一段时间被corrupt掉了,而这段时间正是VDD掉电时,当VDD重新上电instA1的out1又恢复正常了;instA1的out2输出不受VDD掉电的影响。