Gate-Level Simulation
Введение в проектирование на языке Verilog
Прутьянов В. В.
Симуляция
Симуляция RTL-описания – исполнение RTL-кода в соответствии с событийной моделью HDL
Gate-Level Simulation (GLS)
Симуляция
Симуляция RTL-описания – исполнение RTL-кода в соответствии с событийной моделью HDL
Gate-Level Simulation (GLS)
Симуляция
Симуляция RTL-описания – исполнение RTL-кода в соответствии с событийной моделью HDL
Gate-Level Simulation (GLS)
Симуляция
Симуляция RTL-описания – исполнение RTL-кода в соответствии с событийной моделью HDL
Gate-Level Simulation (GLS)
ASIC frontend: Netlist
После синтеза из RTL получается Netlist
ASIC frontend: SDF back-annotation
Инструмент синтеза сохраняет задержки всех элементов и соединений в SDF-файл
Quartus: Compilation > EDA Netlist Writer > Edit Settings
simulation/
└── questa
├── fpga_8_1200mv_0c_slow.vo
├── fpga_8_1200mv_0c_v_slow.sdo
├── fpga_8_1200mv_85c_slow.vo
├── fpga_8_1200mv_85c_v_slow.sdo
├── fpga_min_1200mv_0c_fast.vo
├── fpga_min_1200mv_0c_v_fast.sdo
├── fpga_run_msim_gate_verilog.do
├── fpga_run_msim_rtl_verilog.do
├── fpga_dump_all_vcd_nodes.tcl
├── fpga.vo
└── fpga_v.sdo
SDF vs. Netlist
.............
(CELL (CELLTYPE "cycloneive_lcell_comb")
(INSTANCE blink\|cnt\[2\]\~27)
(DELAY (ABSOLUTE
(PORT dataa (335:335:335) (418:418:418))
(IOPATH dataa combout (461:461:461) (481:481:481))
(IOPATH dataa cout (552:552:552) (416:416:416))
(IOPATH datad combout (177:177:177) (155:155:155))
(IOPATH cin combout (607:607:607) (577:577:577))
(IOPATH cin cout (73:73:73) (73:73:73))
)
)
)
(CELL (CELLTYPE "dffeas")
(INSTANCE blink\|cnt\[2\])
(DELAY (ABSOLUTE
(PORT clk (1826:1826:1826) (1839:1839:1839))
(PORT d (99:99:99) (115:115:115))
(PORT clrn (1706:1706:1706) (1691:1691:1691))
(IOPATH (posedge clk) q (261:261:261) (261:261:261))
(IOPATH (negedge clrn) q (247:247:247) (247:247:247))
)
)
(TIMINGCHECK
(HOLD d (posedge clk) (212:212:212))
)
)
.............
initial $sdf_annotate("fpga_v.sdo");
.............
cycloneive_lcell_comb \blink|cnt[2]~27 (
.dataa(\blink|cnt [2]),
.datab(gnd),
.datac(gnd),
.datad(vcc),
.cin(\blink|cnt[1]~26 ),
.combout(\blink|cnt[2]~27_combout ),
.cout(\blink|cnt[2]~28 ));
defparam \blink|cnt[2]~27 .lut_mask = 16'h5A5F;
defparam \blink|cnt[2]~27 .sum_lutc_input = "cin";
dffeas \blink|cnt[2] (
.clk(\CLK~inputclkctrl_outclk ),
.d(\blink|cnt[2]~27_combout ),
.asdata(vcc),
.clrn(\rst_n~q ),
.aload(gnd),
.sclr(gnd),
.sload(gnd),
.ena(vcc),
.devclrn(devclrn),
.devpor(devpor),
.q(\blink|cnt [2]),
.prn(vcc));
defparam \blink|cnt[2] .is_wysiwyg = "true";
defparam \blink|cnt[2] .power_up = "low";
.............
SDF vs. Netlist
.............
(CELL (CELLTYPE "cycloneive_lcell_comb")
(INSTANCE blink\|cnt\[2\]\~27)
(DELAY (ABSOLUTE
(PORT dataa (335:335:335) (418:418:418))
(IOPATH dataa combout (461:461:461) (481:481:481))
(IOPATH dataa cout (552:552:552) (416:416:416))
(IOPATH datad combout (177:177:177) (155:155:155))
(IOPATH cin combout (607:607:607) (577:577:577))
(IOPATH cin cout (73:73:73) (73:73:73))
)
)
)
(CELL (CELLTYPE "dffeas")
(INSTANCE blink\|cnt\[2\])
(DELAY (ABSOLUTE
(PORT clk (1826:1826:1826) (1839:1839:1839))
(PORT d (99:99:99) (115:115:115))
(PORT clrn (1706:1706:1706) (1691:1691:1691))
(IOPATH (posedge clk) q (261:261:261) (261:261:261))
(IOPATH (negedge clrn) q (247:247:247) (247:247:247))
)
)
(TIMINGCHECK
(HOLD d (posedge clk) (212:212:212))
)
)
.............
initial $sdf_annotate("fpga_v.sdo");
.............
cycloneive_lcell_comb \blink|cnt[2]~27 (
.dataa(\blink|cnt [2]),
.datab(gnd),
.datac(gnd),
.datad(vcc),
.cin(\blink|cnt[1]~26 ),
.combout(\blink|cnt[2]~27_combout ),
.cout(\blink|cnt[2]~28 ));
defparam \blink|cnt[2]~27 .lut_mask = 16'h5A5F;
defparam \blink|cnt[2]~27 .sum_lutc_input = "cin";
dffeas \blink|cnt[2] (
.clk(\CLK~inputclkctrl_outclk ),
.d(\blink|cnt[2]~27_combout ),
.asdata(vcc),
.clrn(\rst_n~q ),
.aload(gnd),
.sclr(gnd),
.sload(gnd),
.ena(vcc),
.devclrn(devclrn),
.devpor(devpor),
.q(\blink|cnt [2]),
.prn(vcc));
defparam \blink|cnt[2] .is_wysiwyg = "true";
defparam \blink|cnt[2] .power_up = "low";
.............
(min:typ:max)
Rise
Fall
ASIC frontend: GLS
Симулятор моделирует Netlist с учетом задержек из SDF-файла
ASIC frontend: GLS
Результаты функциональных тестов на RTL-симуляции и GLS должны совпадать
Пример: GLS для 03_blink
GLS
RTL
Quartus: Tools > Run Simulation Tool > Gate Level Simulation�либо
$ vlog fpga_top_tb.v fpga.vo
$ vsim work.tb -c +transport_int_delays +transport_path_delays -do 'run -all' -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver
Пример: GLS для 03_blink
???
GLS
RTL
Quartus: Tools > Run Simulation Tool > Gate Level Simulation�либо
$ vlog fpga_top_tb.v fpga.vo
$ vsim work.tb -c +transport_int_delays +transport_path_delays -do 'run -all' -L altera_ver -L lpm_ver -L sgate_ver -L altera_mf_ver -L altera_lnsim_ver -L cycloneive_ver
Глитч
Глитч
Пример: глитчи
Glitches
GLS
RTL
Энергопотребление
Итоговое энергопотребление конкретной схемы зависит от множества факторов:
Энергопотребление: КМОП
Значительная часть энергопотребления КМОП-схем приходится на момент переключения (dynamic power):
Энергопотребление: оценка
Анализ энергопотребления: 26-битный счетчик, 50 МГц
Top-level Entity Name : fpga_top
Device : EP4CE15F23C8
Total Thermal Power Dissipation : 79.03 mW
Core Dynamic Thermal Power Dissipation : 0.80 mW
Core Static Thermal Power Dissipation : 49.27 mW
I/O Thermal Power Dissipation : 28.96 mW
Power Estimation Confidence : Medium: user provided moderately complete toggle rate data
+-------------------------+---------------+---------------------------------------------+
; Signal ; Type ; Toggle Rate (millions of transitions / sec) ;
+-------------------------+---------------+---------------------------------------------+
; CLK ; Input Pin ; 100.000 ;
; blink:blink|cnt[0] ; Registered ; 49.997 ;
; blink:blink|cnt[0]~75 ; Combinational ; 49.997 ;
; blink:blink|cnt[1] ; Registered ; 24.998 ;
; blink:blink|cnt[1]~25 ; Combinational ; 24.999 ;
; blink:blink|cnt[1]~26 ; Combinational ; 24.998 ;
; blink:blink|cnt[2] ; Registered ; 12.499 ;
; blink:blink|cnt[2]~27 ; Combinational ; 37.497 ;
; blink:blink|cnt[2]~28 ; Combinational ; 12.499 ;
; blink:blink|cnt[3] ; Registered ; 6.250 ;
; blink:blink|cnt[3]~29 ; Combinational ; 18.749 ;
; blink:blink|cnt[3]~30 ; Combinational ; 6.249 ;
; blink:blink|cnt[4] ; Registered ; 3.125 ;
Анализ энергопотребления: ядро RV32I
Top-level Entity Name : fpga_top
Device : EP4CE15F23C8
Total Thermal Power Dissipation : 114.56 mW
Core Dynamic Thermal Power Dissipation : 41.92 mW
Core Static Thermal Power Dissipation : 50.28 mW
I/O Thermal Power Dissipation : 22.36 mW
Power Estimation Confidence : High: user provided sufficient toggle rate data
Top-level Entity Name : fpga_top
Device : EP4CE15F23C8
Total Thermal Power Dissipation : 126.61 mW
Core Dynamic Thermal Power Dissipation : 53.80 mW
Core Static Thermal Power Dissipation : 50.30 mW
I/O Thermal Power Dissipation : 22.51 mW
Power Estimation Confidence : High: user provided sufficient toggle rate data
Анализ энергопотребления: ядро RV32I
+--------------------------------------------+-------------------------------------------+
; Compilation Hierarchy Node ; Total Thermal Power by Hierarchy (1) ;
+--------------------------------------------+-------------------------------------------+
; |fpga_top ; 43.68 mW (6.76 mW) ; 55.71 mW (8.63 mW) ;
; |hard_block:auto_generated_inst ; 0.00 mW (0.00 mW) ; 0.00 mW (0.00 mW) ;
; |system_top:system_top ; 36.93 mW (0.00 mW) ; 47.08 mW (0.00 mW) ;
; |cpu_top:cpu_top ; 36.50 mW (0.00 mW) ; 46.26 mW (0.00 mW) ;
; |core:core ; 31.79 mW (10.39 mW) ; 40.68 mW (18.39 mW) ;
; |alu:alu ; 6.08 mW (6.08 mW) ; 7.96 mW (7.96 mW) ;
; |mux4:alu_b_mux4 ; 1.77 mW (1.77 mW) ; 2.48 mW (2.48 mW) ;
; |cmp:cmp ; 0.42 mW (0.42 mW) ; 0.26 mW (0.26 mW) ;
; |control:control ; 0.49 mW (0.49 mW) ; 0.72 mW (0.72 mW) ;
; |lsu:lsu ; 0.40 mW (0.40 mW) ; 0.42 mW (0.42 mW) ;
; |reg_file:reg_file ; 11.03 mW (11.03 mW) ; 10.25 mW (10.25 mW) ;
; |signext:signext ; 1.22 mW (1.22 mW) ; 0.20 mW (0.20 mW) ;
; |dmem:dmem ; 0.99 mW (0.00 mW) ; 1.35 mW (0.00 mW) ;
; |ram1rw32x256:ram1rw32x256 ; 0.99 mW (0.99 mW) ; 1.35 mW (0.00 mW) ;
; |imem:imem ; 3.53 mW (0.00 mW) ; 3.83 mW (0.00 mW) ;
; |imem1r32x256:imem1r32x256 ; 3.53 mW (3.53 mW) ; 3.83 mW (0.00 mW) ;
; |mem_xbar:mem_xbar ; 0.19 mW (0.19 mW) ; 0.41 mW (0.41 mW) ;
; |ctrl_74hc595:ctrl_74hc595 ; 0.15 mW (0.15 mW) ; 0.14 mW (0.14 mW) ;
; |hex_display:hex_display ; 0.18 mW (0.18 mW) ; 0.49 mW (0.49 mW) ;
; |hexdec:hexdec ; 0.00 mW (0.00 mW) ; 0.00 mW (0.00 mW) ;
; |mmio_xbar:mmio_xbar ; 0.11 mW (0.11 mW) ; 0.18 mW (0.18 mW) ;
+--------------------------------------------+---------------------+---------------------+
2-stage, 60MHz 3-stage, 70 MHz
Энергопотребление: оптимизация