Xilinx DDR3 のMIG Simulation
Veritakでは、SecureIPで暗号化されたIPは、シミュレーションすることができません。
SecureIPで暗号化されていないIPは、シミュレーションすることができますが、現時点では、修正が必要です。
以下は、例です。
1.Mig33で Virtex6 DDR3で生成
以下は、mig33が生成したデータシートです。
CORE Generator Options: Target Device : xc6vlx550t-ff1759 Speed Grade : -2 HDL : verilog Synthesis Tool : XST MIG Output Options: Module Name : mig33 No of Controllers : 1 Selected Compatible Device(s) : -- Hardware Test Bench : enabled FPGA Options: Clock Type : Differential Debug Port : OFF Extended FPGA Options: DCI for DQ,DQS/DQS#,DM : enabled DCI for Address/Control : enabled /*******************************************************/ /* Controller 0 */ /*******************************************************/ Controller Options : Memory : DDR3_SDRAM Design Clock Frequency : 1875 ps (533.33 MHz) Memory Type : Components Memory Part : MT41J128M8XX-15E Equivalent Part(s) : MT41J128M8HX-15E Data Width : 8 ECC : Disabled Data Mask : enabled ORDERING : Normal Memory Options: Burst Length (MR0[1:0]) : 8 - Fixed Read Burst Type (MR0[3]) : Sequential CAS Latency (MR0[6:4]) : 8 Write Recovery (MR0[11:9]) : 5 Output Drive Strength (MR1[5,1]) : RZQ/7 Rtt_NOM - ODT (MR1[9,6,2]) : RZQ/4 Rtt_WR - Dynamic ODT (MR2[10:9]) : Dynamic ODT off FPGA Options: IODELAY PERFORMANCE MODE : HIGH Selected Banks and Pins usage : Data :bank 26(40) -> Number of pins used : 12 Address/Control:bank 25(40) -> Number of pins used : 27 System Clock :bank 35(40) -> Number of pins used : 7 BUFR :bank 25(40) -> Number of pins used : 1 BUFIO :bank 26(40) -> Number of pins used : 1 Total IOs used : 47
2.ソースの修正
2.1 ISE11.1/12.1共通
2.1.1 ビット幅の修正/グリッチの除去
unisimのoserdes1.v:
`ifdef Veritak output [1:0] qwc, qrd;//ビット幅宣言を下に合わせる `else output qwc, qrd; `endif output rd_gap1, extra; reg [1:0] qwc; reg [1:0] qrd;
`ifdef VeritakSV assign OQ = oq_out;//VeritakSVは、SpecifySectionをサポート `elsif Veritak assign #(100) OQ = oq_out;//慣性遅延で、グリッチによる誤トリガを除去 `else assign OQ = oq_out;//TAK `endif assign SHIFTOUT1 = shiftout1_out; assign SHIFTOUT2 = shiftout2_out; assign TFB = tfb_out; `ifdef VeritakSV assign TQ = tq_out;//TAK `elsif Veritak assign #(100) TQ = tq_out; `else assign TQ = tq_out;//TAK `endif specify ( CLK => OFB) = (0, 0); ( CLK => OQ) = (100, 100); ( CLK => SHIFTOUT1) = (0, 0); ( CLK => SHIFTOUT2) = (0, 0); ( CLK => TFB) = (0, 0); ( CLK => TQ) =(100, 100); ( CLKPERF => OFB) = (0, 0); ( CLKPERF => OQ) = (100, 100); ( CLKPERF => SHIFTOUT1) = (0, 0); ( CLKPERF => SHIFTOUT2) = (0, 0); ( CLKPERF => TFB) = (0, 0); ( CLKPERF => TQ) = (100 , 100); ( CLKPERFDELAY => OFB) = (0, 0); ( CLKPERFDELAY => OQ) = (100, 100); ( CLKPERFDELAY => SHIFTOUT1) = (0, 0); ( CLKPERFDELAY => SHIFTOUT2) = (0, 0); ( CLKPERFDELAY => TFB) = (0, 0); ( CLKPERFDELAY => TQ) = (100, 100); ( T1 => TQ) = (0, 0); `ifdef VeritakSV specparam PATHPULSE$ = 1; `else specparam PATHPULSE$ = 0; `endif endspecify
3.Veritakプロジェクトファイル
example_design/sim フォルダにおいてプロジェクトを生成してください。以下は、こちらで行ったプロジェクトをエクスポートしました。
-Define x8 -Define sg15E -Define x1Gb wiredly.v ddr3_model.v glbl.v sim_tb_top.v ../rtl/phy/rd_bitslip.v ../rtl/phy/circ_buffer.v ../rtl/phy/phy_ck_iob.v ../rtl/phy/phy_clock_io.v ../rtl/phy/phy_control_io.v ../rtl/phy/phy_data_io.v ../rtl/phy/phy_dly_ctrl.v ../rtl/phy/phy_dm_iob.v ../rtl/phy/phy_dq_iob.v ../rtl/phy/phy_dqs_iob.v ../rtl/phy/phy_init.v ../rtl/phy/phy_ocb_mon.v ../rtl/phy/phy_pd.v ../rtl/phy/phy_pd_top.v ../rtl/phy/phy_rdclk_gen.v ../rtl/phy/phy_rdctrl_sync.v ../rtl/phy/phy_rddata_sync.v ../rtl/phy/phy_rdlvl.v ../rtl/phy/phy_read.v ../rtl/phy/phy_top.v ../rtl/phy/phy_write.v ../rtl/phy/phy_wrlvl.v ../rtl/ui/ui_wr_data.v ../rtl/ui/ui_cmd.v ../rtl/ui/ui_rd_data.v ../rtl/ui/ui_top.v ../rtl/traffic_gen/write_data_path.v ../rtl/traffic_gen/afifo.v ../rtl/traffic_gen/cmd_gen.v ../rtl/traffic_gen/cmd_prbs_gen.v ../rtl/traffic_gen/data_prbs_gen.v ../rtl/traffic_gen/init_mem_pattern_ctr.v ../rtl/traffic_gen/mcb_flow_control.v ../rtl/traffic_gen/mcb_traffic_gen.v ../rtl/traffic_gen/pipeline_inserter.v ../rtl/traffic_gen/rd_data_gen.v ../rtl/traffic_gen/read_data_path.v ../rtl/traffic_gen/read_posted_fifo.v ../rtl/traffic_gen/sp6_data_gen.v ../rtl/traffic_gen/tg_status.v ../rtl/traffic_gen/v6_data_gen.v ../rtl/traffic_gen/wr_data_gen.v ../rtl/ip_top/memc_ui_top.v ../rtl/ip_top/clk_ibuf.v ../rtl/ip_top/ddr2_ddr3_chipscope.v ../rtl/ip_top/example_top.v ../rtl/ip_top/infrastructure.v ../rtl/ip_top/iodelay_ctrl.v ../rtl/ip_top/mem_intfc.v ../rtl/controller/col_mach.v ../rtl/controller/arb_mux.v ../rtl/controller/arb_row_col.v ../rtl/controller/arb_select.v ../rtl/controller/bank_cntrl.v ../rtl/controller/bank_common.v ../rtl/controller/bank_compare.v ../rtl/controller/bank_mach.v ../rtl/controller/bank_queue.v ../rtl/controller/bank_state.v ../rtl/ecc/ecc_merge_enc.v ../rtl/ecc/ecc_buf.v ../rtl/ecc/ecc_dec_fix.v ../rtl/ecc/ecc_gen.v ../rtl/phy/phy_pd_top.v ../rtl/phy/phy_ocb_mon_top.v -lib_dir ../../../../../11.1/ISE/verilog/src/unisims ../rtl/controller/round_robin_arb.v ../rtl/controller/mc.v ../rtl/controller/rank_cntrl.v ../rtl/controller/rank_common.v ../rtl/controller/rank_mach.v
4.波形観測
テストベンチは、無限ループになっているようですので、適当なところで止めてください。
また、波形全部を観測するとDiskがすぐ一杯になってしまうので、波形選択を行うか(プロ版のみ)、または、下のような方法でVCDで観測してください。
5.12.1の修正
1)glbl.v のコピー
mig33 でsim フォルダ下に生成されますが、古いようです。12.1のunisimフォルダにあるものをコピーして置き換えてください。
2)そのままですと、エラーで止まってしまいSimが進みませんので、強制的に走らせるパッチです。
unisim mmcm_adv.v;
`define FORCE_SIM `ifdef FORCE_SIM localparam M_MIN = 4.000; `else localparam M_MIN = 5.000; `endif `ifdef FORCE_SIM chk_ok = para_real_range_chk(CLKFBOUT_MULT_F, tmp_string, 4.000, 64.000); `else chk_ok = para_real_range_chk(CLKFBOUT_MULT_F, tmp_string, 5.000, 64.000); `endif