例子中最初dut和环境见上篇low power-upf-vcsnlp(二)
例子中dut和环境在上篇基础上修改来low power-upf-vcsnlp(四)
5.set_isolation命令

-elements 设置哪些需要被clamp的信号,可以按照hierarchy来列出,可以细化到信号的某一位比如设置一个inst0/reg_o[0],而若是reg_o是多位,可以设置为inst0/reg_o[*]或者直接写inst0/reg_o。
-applies_to可以将所有outputs或者inputs都clamp住不用单独使用elements列出来。
-location 设置isolation cell放置的位置。
-clamp_value设置clamp的值。
-isolation_signal设置isolation的使能信号。-isolation_sense设置使能时使能信号的状态。
-isolation_supply设置isolation的supply_set。
(1)添加PD0的isolation cell.
test.upf修改为如下的形式,其他文件不变,注意在需要进行iso时,iso的供电不能掉电的,所以iso不能和掉电模块使用同一个电源。:
set_design_top top/dut_u
#create_power_domain PD_TOP -include_scope
create_power_domain PD_TOP -elements {.} \
-exclude_elements {inst0}
create_supply_port VDD_TOP
create_supply_port VSS_TOP
create_supply_net VDD_TOP
create_supply_net VSS_TOP
connect_supply_net VDD_TOP -ports VDD_TOP
connect_supply_net VSS_TOP -ports VSS_TOP
create_supply_set PD_TOP_SET \
-function {power VDD_TOP} \
-function {power VSS_TOP}
create_power_domain PD_TOP \
-supply {primary PD_TOP_SET} \
-update
create_supply_port VDD_TOP0
create_supply_net VDD_TOP0
connect_supply_net VDD_TOP0 -ports VDD_TOP0
#PD0
set_scope inst0
create_power_domain PD0 -elements {.}
create_supply_port VDD0_i
create_supply_port VSS0
create_supply_net VDD0_i
create_supply_net VSS0
#这个net是接到power switch中的output_supply_port上,并且作为PD0的supply_net.
create_supply_net VDD0_o
connect_supply_net VDD0_i -ports VDD0_i
connect_supply_net VSS0 -ports VSS0
create_power_switch PD0_SWITCH -domain PD0 \
-input_supply_port {in0 VDD0_i} \
-output_supply_port {out0 VDD0_o } \
-control_port {en0 pwr_en} \
-on_state {PD0_on in0 {en0}} \
-off_state {PD0_off {!en0}} \
-ack_port {en_ack pwr_ack {en0}} \
-ack_delay {en_ack 10ns}
create_supply_set PD0_SET \
-function {power VDD0_o} \
-function {ground VSS0}
create_power_domain PD0 \
-supply {primary PD0_SET} \
-update
set_scope ..
connect_supply_net VSS_TOP -ports inst0/VSS0
connect_supply_net VDD_TOP0 -ports inst0/VDD0_i
create_supply_port VDD_TOP1
create_supply_port VDD_TOP1
connect_supply_net VDD_TOP1 -ports VDD_TOP1
#PD1
set_scope inst1/buf_u
create_power_domain PD1 -elements {.}
create_supply_port VDD1_i
create_supply_port VSS1
create_supply_net VDD1_i
create_supply_net VSS1
create_supply_net VDD1_o
connect_supply_net VDD1_i -ports VDD1_i
connect_supply_net VSS1 -ports VSS1
create_power_switch PD1_SWITCH -domain PD1 \
-input_supply_port {in1 VDD1_i} \
-output_supply_port {out1 VDD1_o } \
-control_port {en1 pwr_en} \
-on_state {PD1_on in1 {en1}} \
-off_state {PD1_off {!en1}}
create_supply_set PD1_SET \
-function {power VDD1_o} \
-function {ground VSS1}
create_power_domain PD1 \
-supply {primary PD1_SET} \
-update
set_scope ..
connect_supply_net VSS_TOP -ports inst1/buf_u/VSS1
connect_supply_net VDD_TOP1 -ports inst1/buf_u/VDD1_i
#add isolation cell
set_isolation inst0_iso -domain inst0/PD0 \
-elements {inst0/reg_o} \
-clamp_value 0 \
-isolation_signal pmu_iso_en[0] \
-isolation_supply PD_TOP_SET \
-isolation_sense high \
-location parent
仿真结果,verdi 的power map入下所示在PD0和PD_TOP之间插入了一个isolation cell:

此时代码窗口中,out0显示了iso表示,将鼠标放上去,会显示这个out0所属的isolation cell的详细信息,包括out0应该clamp住的值。

此时,因为iso_en没有打开,在top中一直赋值为0(见上一篇的tb内容),所以波形表现上,当掉电后,out0的输出仍然是不定态:

注意运行结果中会有low power的日志,保存在vcs_lpmsg.log中。默认不使用supply_on情况下,VSS和VDD都上电为1V。如果要自己指定,那么就使用supply_on,并给出电压参数。见low power-upf-vcsnlp(六)中的例子。

(2)将isolation使能。
现在在掉电之前,现将isolation打开。top修改为如下内容,在掉电之前将isolation的使能打开,并且在重新上电后关闭:
`timescale 1ns/1ps
module top();
import UPF::*;
reg clk;
reg rstn;
reg [1:0] iso_en;
reg [1:0] pwr_en;
initial begin
clk = 0;
rstn = 0;
iso_en = 0;
pwr_en = 3;
#20ns rstn = 1;
#400ns;
#100ns iso_en = 1;
pwr_en = 0;
#100ns pwr_en = 2;
#100ns pwr_en = 3;
iso_en = 0;
#100ns;
$finish;
end
initial begin
$fsdbDumpfile("top.fsdb");
$fsdbDumpvars();
$fsdbDumpvars("+power");
end
initial begin
reg0=0;
reg1=0;
#100ns reg0 = 1;
#100ns reg1 = 1;
#100ns reg0 = 0;
#200ns;
end
initial begin
//supply
end
dut dut_u(.in0(reg0), .in1(reg1), .clk(clk), .rstn(rstn), .iso_en(iso_en), .pwr_en(pwr_en));
endmodule
仿真后的波形如下,可以看阿金out0已没在出现不定态,但是out1没有isolation单元,所以仍然是不定态的。

(3)设置多个多位信号的isolation。
修改reg为4 bits的。inst.v内容如下:
module inst (input [3:0] reg_i,input iso_en,input pwr_en,output [3:0] reg_o, output [3:0] reg_o1, output pwr_ack);
wire [3:0] reg_o1 = ~reg_i;
Buf buf_u(.in(reg_o1),.pwr_en(pwr_en).out(reg_o));
endmodule
module Buf(input [3:0] in,input pwr_en,output [3:0] out);
assign out = in;
endmodule
dut.v内容如下:
module dut(input [3:0] in0, input [3:0] in1, input clk, input rstn, input [1:0] iso_en, input [1:0] pwr_en);
wire [3:0] out0,out1,out0_1,out1_1;
wire [1:0] pmu_iso_en;
wire [1:0] pmu_pwr_en;
pmu pmu_u(.clk(clk), .rstn(rstn), .iso_en_in(iso_en), .pwr_en_in(pwr_en), .iso_en_out(pmu_iso_en), .pwr_en_out(pmu_pwr_en));
inst inst0(.reg_i(in0),.iso_en(pmu_iso_en[0]),.pwr_en(pmu_pwr_en[0]),.reg_o(out0),.reg_o1(out0_1));
inst inst1(.reg_i(in1),.iso_en(pmu_iso_en[1]),.pwr_en(pmu_pwr_en[1]),.reg_o(out1),.reg_o1(out1_1));
endmodule
top.sv修改的内容如下:
initial begin
reg0=0;
reg1=0;
#100ns reg0 = 3;
#100ns reg1 = 3;
#100ns reg0 = 0;
#200ns;
end
test.upf修改内容如下:
#add isolation cell
set_isolation inst0_iso -domain inst0/PD0 \
-elements {inst0/reg_o[0]
inst0/reg_o1
} \
-clamp_value 0 \
-isolation_signal pmu_iso_en[0] \
-isolation_supply PD_TOP_SET \
-isolation_sense high \
-location parent
仿真波形如下,reg_o只有一个bit被isolation了,verdi代码窗口中显示被isolation的信号.


参考[0]:IEEE 1801-2015 IEEE Standard for Design and Verification of Low-Power, Energy-Aware Electronic Systems
verdi版本:R-2020.12-SP2
vcs版本: Q-2020.03-SP2
参考[1]: VCS Native Low Power (NLP)User Guide.

这篇博客详细介绍了如何在VCS中使用UPF进行低功耗设计,特别是`set_isolation`命令的应用。内容包括添加隔离单元、启用隔离以及设置多位信号隔离,通过实例演示了如何配置UPF文件和修改测试平台,以实现不同信号的隔离效果,并观察波形验证其功能。
2678

被折叠的 条评论
为什么被折叠?



