BAB 5
VERIFIKASI DAN SINTESIS INVERSE-CABAC
Setelah proses perancangan arsitektur Inverse-CABAC dan perancangan RTL dalam kode Verilog HDL selesai dilakukan, tahap berikutnya adalah memverifikasi dan sintesis rancangan. Proses verifikasi yang dijelaskan pada bagian ini adalah verifikasi fungsional rancangan RTL dan verifikasi netlist hasil proses sintesis.
5.1 Verifikasi Fungsional
Proses verifikasi fungsional dilakukan untuk memastikan bahwa desain telah bekerja sesuai dengan fungsi yang dispesifikasikan, dalam hal ini adalah test vector yang dihasilkan dari program acuan. Tujuan fungsional dari desain Inverse-CABAC adalah men-decode input bitstream sehingga menghasilkan kode-kode biner yang kemudian akan menjadi input inverse binerisasi. Verifikasi fungsional yang dilakukan terhadap desain Inverse-CABAC ini adalah dengan melakukan simulasi timing terhadap test vector yang berupa bitstream. Verifikasi fungsional dilakukan dengan mengunakan tool simulasi ModelSim SE 6.0 dari Mentor Graphic.
5.1.1 Metodologi Verifikasi
Untuk mendapatkan hasil verifikasi yang valid, maka diperlukan suatu metodologi verifikasi yang baik. Metode verifikasi rancangan Inverse-CABAC meliputi penentuan skema verifikasi, pembuatan test vector dari model referensi, serta perancangan testbench RTL.
DUT : Inverse CABAC Input Vector Output Vector Compare Stimulus Generator PASSED or FAILED RTL Testbench
Gambar 5.1 Skema Verifikasi Inverse CABAC
Pada proses verifikasi, test vector yang digunakan adalah data bitstream sebagai data input dan data bit yang di-decode sebagai data output. Test vector ini dihasilkan dari model referensi, yaitu JM 11.0, yang merupakan model standard untuk sistem H.264.
Untuk proses verifikasi desain RTL, maka diperlukan sebuah testbench RTL, yang berfungsi untuk menghasilkan sinyal stimulus. Testbench ini juga berfungsi untuk memberikan data input dan output berdasarkan timing yang telah ditentukan. Untuk validasi nilai output desain RTL dengan referensi output, pada perancangan ini, testbench dirancang memiliki fitur auto-compare.
Berikut adalah potongan RTL testbench:
/* --- */ /*Input Pattern Generation */ /* --- */ wire[9:0]input_count=
CabacDec.buff_stream.buff_stream_ctrl.RAM_addr; reg load_bitstream;
always @(posedge clock) if (start_dec)
load_bitstream <= #1 1'b1; else if
load_bitstream <= #1 1'b0;
always @(input_count or load_bitstream) if (load_bitstream)
bitstream_in = #1 bitstream_buff[input_count]; else
bitstream_in = #1 1'bx;
/* ---*/ /* Reference Output Generation */
/* ---*/ Wire dec_bitout_en = CabacDec.arcod.arcod_ctrl.mux_dataout_en | CabacDec.bypass.bypass_output_en; Wire [9:0] output_count = CabacDec.init_cntx.init_cntx_ctrl.ROM_idx_addr; reg ref_dec_bitout;
always @ (posedge clock) if (dec_bitout_en)
ref_dec_bitout <= #1 dec_bin_buff [output_count-1]; else
ref_dec_bitout <= #1 ref_dec_bitout;
/* --- */ /* Comparing Actual Output with Reference Output */
/* --- */
wire output_state_valid = CabacDec.arcod.arcod_ctrl.arcod_done | CabacDec.bypass.bypass_done;
wire decout_bit = CabacDec.dec_bitout;
always @ (posedge clock) if (output_state_valid)
if (decout_bit != ref_dec_bitout) begin
$display ("!!!ERROR at data [%3d] : Actual decout_bit = %1b, Expected decout_bit = %1b",
output_count-1, decout_bit, ref_dec_bitout); error = error + 1;
end else begin
$display ("TEST PASSED : decout_bit [%3d] = %1b", output_count-1, decout_bit); error = error;
5.1.2 Hasil Verifikasi
Sebelum dilakukan verifikasi desain yang terintegrasi, maka dilakukan verifikasi desain pada sub modul desain Inverse-CABAC terlebih dahulu. Verifikasi secara modular dilakukan untuk memastikan fungsionalitas modul-modul yang akan diintegrasikan. Verifikasi pada tingkat modul, dilakukan dengan menganalisis timing diagram setiap data dan sinyal-sinyal kontrol. Dengan dilakukan verifikasi secara modular terlebih dahulu, diharapkan tingkat kesulitan proses debugging pada top level dapat dikurangi.
Hasil verifikasi dari setiap sub modul desain Inverse-CABAC adalah sebagai berikut.
5.1.2.1Buffer Stream
Gambar 5.2 menunjukkan bahwa state buffer stream akan berpindah dari state IDLE (pstate = 0) ke state WRITE_STREAM (pstate = 1), yaitu saat sinyal start_buff bernilai “1”. Dengan demikian proses pada modul buffer stream dapat mulai dilakukan, yaitu penulisan nilai bit stream ke RAM.
Gambar 5.2 Simulasi Transisi State IDLE ke State WRITE_STREAM
Proses penulisan bitstream dilakukan secara berurutan sebanyak 664 kali, sesuai dengan jumlah bitstream yang dibutuhkan pada perancangan Inverse-CABAC. Setelah nilai counter (count_664) mencapai nilai maksimum, yaitu 663, maka state buffer stream berpindah dari state WRITE_STREAM ke state
READ_INIT (pstate = 2). Nilai maksimum counter ditunjukkan dengan sinyal status end_count bernilai “1”. Proses pada state WRITE_STREAM ditunjukkan pada gambar 5.3.
Gambar 5.3 Simulasi Transisi State WRITE_STREAM ke State READ_INIT
Setelah penulisan bitstream dilakukan, proses berikutnya adalah pembentukan nilai awal offset, yang digunakan untuk proses binary decoding. Proses pembentukan nilai offset dilakukan dengan membaca 9 data pertama dari initRAM.
Gambar 5.4 Simulasi Transisi State READ_INIT ke State READ_STREAM
Data yang dibaca dari initRAM kemudian masuk ke rangkaian shift register. Proses shifting dilakukan selama sinyal shift_enable bernilai “1”, yaitu selama 9 clock cycle. Nilai offset yang terbentuk (initstream_out) valid ditunjukkan dengan sinyal init_streamready bernilai “1”. Dari gambar 5.5 terlihat nilai awal
offset yang dihasilkan adalah 0x1b0, sesuai dengan nilai awal offset dalam test vector.
Gambar 5.5 Hasil Simulasi Shift Register untuk Membentuk Nilai Offset Awal
Setelah pembentukan nilai awal offset, proses berikutnya pembacaan bitstream untuk proses binary decoding. Proses transisi dari state READ_INIT ke state READ_STREAM ini dapat dilihat ada gambar 5.4. Pembacaan bitstream dilakukan jika pada proses decoding diperlukan proses renormalisasi, atau proses decoding berlangsung pada mode bypass. Proses renormalisasi ditunjukkan dengan sinyal renorm bernilai “1”, sedangkan proses decoding pada mode normal ditunjukkan dengan sinyal bypass_enable bernilai “1”. Karena jumlah bitstream pada setiap proses decoding mode bypass hanya 1 bit, maka sinyal kontrol untuk pembacaan RAM, RAM_ce, hanya diambil dari 1 clock cycle pertama sinyal bypass_enable. Hasil simulasi pembacaan bitstream ini dapat dilihat pada gambar berikut:
5.1.2.2Init Context
Gambar 5.7 menunjukkan bahwa proses pada Init Context dimulai setelah sinyal start_context aktif. Saat sinyal start_context bernilai “1”, state Init Context berpindah dari state IDLE (pstate = 0) ke state WRITE_INIT (pstate = 1). Pada state WRITE_INIT, dilakukan penulisan nilai context model (ste_mps) ke RAM context. Nilai RAM context merupakan hasil perhitungan block Init Context Core. Proses penghitungan setiap nilai context model dilakukan dalam 5 clock cycle, yaitu dari nilai initcntx_stepcount 0 sampai 4. Penulisan nilai context model dilakukan saat initcntxt_stepcount bernilai 4, yang ditunjukkan dengan sinyal kontrol RAM_we bernilai “1”.
Gambar 5.7 Hasil Simulasi Modul Init Context
5.1.2.3Arcod
Gambar 5.8 menunjukkan proses binary decoding pada mode normal. Proses decoding dilakukan saat sinyal arcod_enable bernilai “1”. Proses decoding diawali dengan proses update nilai offset dan range, yang dilakukan selama 4 clock cycle. Dari proses update ini didapatkan juga nilai status offs_high_valid. Pada clock kelima, yaitu saat state RANGE_CHECK, dilakukan proses pengecekan nilai range. Jika nilai range lebih kecil dari 0x100, maka status range_low_valid bernilai “1”. Dari nilai status offset dan range ini, maka dapat diputuskan apakah proses renormalisasi harus dilakukan atau tidak. Jika kedua
sinyal status, offs_high_valid dan range_low_valid bernilai “1” maka proses renormalisasi dilakukan. Proses renormalisasi dilakukan pada state RENORM (pstate = 6). Proses binary decoding dilakukan dalam 6 clock cycle, untuk proses tanpa renormalisasi, atau dalam (6 + 2n) clock cycle jika proses decoding membutuhkan renormalisasi. Setiap proses renormalisasi membutuhkan 2 buah clock cycle, yaitu masing-masing untuk proses penghitungan nilai renormalisasi offset dan range dan pengecekan kembali nilai range.
Binary Decoding State
Decoding tanpa renormalisasi
Decoding dengan renormalisasi
Gambar 5.8 Hasil Simulasi Modul Arcod
5.1.2.4Bypass
Gambar 5.9 menunjukkan proses binary decoding pada mode bypass. Setiap proses decoding pada mode bypass dilakukan dalam 2 clock cycle. Clock cycle pertama untuk proses update nilai range dan offset, sedangkan clock cycle kedua untuk validasi data. Dengan validasi ini, data dapat ditulis di register offset dan range.
Gambar 5.9 Hasil Simulasi Modul Bypass
5.1.2.5Register Offset dan Range
Tahap terakhir dari proses Inverse-CABAC adalah penulisan nilai akhir offset dan range yang dihasilkan dari setiap proses binary decoding. Proses penulisan dapat dilakukan saat sinyal kontrol offs_range_we bernilai “1”. Sinyal kontrol ini dihasilkan saat sinyal status arcod_done atau bypass_done bernilai “1”. Sinyal status ini juga digunakan sebagai sinyal kontrol untuk pemilihan data offset dan range yang harus ditulis ke register. Berikut adalah hasil simulasi pada modul register offset dan range.
5.1.2.6Top Level Inverse-CABAC
Verifikasi rancangan Inverse-CABAC yang telah terintegrasi dilakukan dengan membandingkan test vector acuan dengan output Inverse-CABAC. Proses verifikasi pada top level dilakukan dengan berbasis auto-compare. Dengan menggunakan metode verifikasi ini tingkat kesulitan verifikasi dan waktu yang dibutuhkan untuk verifikasi dapat dikurangi. Hasil simulasi ditunjukkan pada gambar 5.11.
Gambar 5.11 Hasil Simulasi Rancangan Inverse-CABAC
5.2 Implementasi
Setelah desain telah diverifikasi secara fungsional, tahap perancangan berikutnya adalah implementasi desain pada FPGA. Proses implementasi dilakukan dengan menggunakan EDA tools ISE Xilinx 9.1i pada target devais Virtex-4 XC4VSX35-10F668.
Tahap pertama proses implementasi adalah sintesis desain. Pada tahap sintesis, desain dalam bentuk kode HDL dipetakan menjadi interkoneksi gerbang logika (netlist) berdasarkan target devais yang telah ditentukan. Dari proses sintesis didapatkan performa rancangan berupa Device Utilization Summary dan Timing Summary. Report sintesis menunjukkan bahwa rancangan Inverse CABAC memerlukan 7% slice area FPGA dengan frekuensi kerja maksimum 118.68 MHz.
Device utilization summary: ---
Selected Device : 4vsx35ff668-11
Number of Slices: 1122 out of 15360 7% Number of Slice Flip Flops: 267 out of 30720 0% Number of 4 input LUTs: 2141 out of 30720 6% Number of IOs: 29
Number of bonded IOBs: 29 out of 448 6% Number of FIFO16/RAMB16s: 4 out of 192 2% Number used as RAMB16s: 4
Number of GCLKs: 1 out of 32 3% Number of DSP48s: 1 out of 192 0% Timing Summary:
--- Speed Grade: -11
Minimum period: 8.426ns (Maximum Frequency: 118.680MHz) Minimum input arrival time before clock: 3.815ns
Maximum output required time after clock: 11.014ns Maximum combinational path delay: No path found
Tahap selanjutnya adalah proses Translate. Pada tahap ini, netlist hasil proses sintesis diidentifikasi dan diaplikasikan dalam top level rancangan. Dari proses Translate dihasilkan netlist dalam format NGD (Native Generic Design). Pada tahap ini seluruh constraint diaplikasikan pada netlist. Setlah itu dilakukan proses Map, yaitu proses optimasi gerbang logika dan jalur interkoneksi yang tidak
terpakai dan memetakan rancangan ke resource FPGA. Pada tahap Map, dilakukan juga pemeriksaan design-rule pada target devais serta memetakan elemen-elemen dasar menjadi Configurable Logic Block (CLB).
Design Summary --- Design Summary: Number of errors: 0 Number of warnings: 1 Logic Utilization:
Number of Slice Flip Flops: 265 out of 30,720 1% Number of 4 input LUTs: 2,125 out of 30,720 6% Logic Distribution:
Number of occupied Slices: 1,182 out of 15,360 7%
Number of Slices containing only related logic: 1,182 out of 1,182 100%
Number of Slices containing unrelated logic: 0 out of 1,182 0%
*See NOTES below for an explanation of the effects of unrelated logic
Total Number of 4 input LUTs: 2,138 out of 30,720 6% Number used as logic: 2,125
Number used as a route-thru: 13
Number of bonded IOBs: 29 out of 448 6% Number of BUFG/BUFGCTRLs: 1 out of 32 3% Number used as BUFGs: 1
Number used as BUFGCTRLs: 0
Number of FIFO16/RAMB16s: 4 out of 192 2% Number used as FIFO16s: 0
Number used as RAMB16s: 4
Number of DSP48s: 1 out of 192 1% Total equivalent gate count for design: 278,749
Additional JTAG gate count for IOBs: 1,392
Proses terakhir adalah PAR (Place and Route). Place merupakan proses peletakan blok logika termasuk struktur CLB dan IOB pada tempat tertentu pada arsitektur devais target. Routing adalah proses memberikan pin-pin pada blok-blok logika.
5.3 Verifikasi Netlist Hasil PAR
Untuk memastikan rancangan hasil proses PAR masih memiliki kesamaan fungsional dengan rancangan RTL sebelum sintesis, maka dilakukan simulasi ulang. Simulasi dilakukan pada netlist, yang dihasilkan dari tahap PAR. Dari tahap ini, juga dihasilkan file Standard Delay Format (SDF), yang berisi
parameter timing dari setiap logic block yang terpakai oleh desain Inverse CABAC. Selain netlist dan SDF files, untuk simulasi pada level gate dibutuhkan juga komponen SIMPRIMS library. Proses simulasi dilakukan dengan menggunakan RTL testbench yang juga digunakan pada simulasi RTL. Hasil simulasi netlist setelah PAR menunjukkan rancangan masih memiliki fungsional yang sama.
5.4 Analisis Kinerja Inverse-CABAC
Dari proses sintesis, diperoleh bahwa rancangan Inverse-CABAC berhasil diimplementasikan dengan total equivalent gate count 278749 gate, dengan frekuensi kerja maksimum sebesar 118 MHz. Untuk frekuensi kerja sistem sebesar 100 MHz, maka rancangan Inverse CABAC memiliki throughput sebesar 10,43 Mbps. Nilai throughput diperoleh dari perhitungan sebagai berikut :
Jumlah bit yang di- x frekuensi kerja Total clock cycle
791 x 100 M 7580 10, 44 Mbps decode Throughput= = =