FC2カウンター FPGAの部屋 2010年09月06日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ArbiterのアサーションをOVLに変更

昨日、FPGA-CAFEでSCCBの配線をハンダ付けしてきたので、SCCBを追加するつもりなのだけれど、その前に、以前に”Spartan-3A Starter KitでCMOSカメラ・ディスプレイ回路6(シミュレーション2)”で書いたArbiterのVerilogアサーションをOVLにしてみた。

アドレスが4増加しているアサーションにovl_transitionを使おうと思ったのだが、どうもうまく行かなかった。結局、enableに条件を入れて、ovl_alwaysを使うことにした。なかなかいろいろなアサーションのうちどれを使うかが難しい。次は、DDR2 SDRAMコントローラにアサーションを入れる予定なので、その時にはいろいろなOVLアサーションを使えると期待している。
下に、ArbiterのOVLアサーションを示す。

    // アサーション
    // synthesis translate_off
    always @ (posedge clk_ddr2) begin
        if (reset_ddr2) begin
            camc_addr_1d <= 0;
            vgadc_addr_1d <= 0;
            addr_assertion_valid <= 1'b0;
        end else begin
            if (ddr2_addr_we) begin
                camc_addr_1d <= camc_addr;
            end
            if (vgadc_addr_we) begin
                vgadc_addr_1d <= vgadc_addr;
            end
            if (ddr2_addr_we || vgadc_addr_we) begin
                addr_assertion_valid <= 1'b1;
            end
        end
    end
    
    // Camera_Controller が有効の時にVGA_Display_Controller がライトしないことをチェックするOVLアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : Camera_Controller が有効の時にVGA_Display_Controller がライトした", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_vga_we_assertion (clk_ddr2, reset_ddr2, 1'b1, (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && vgadc_addr_we, fire_camc_vgac);
    
    // 現在のCamera_Controller からのWrite Addressが以前のWrite Addressの+4かどうかをチェックするOVLアサーション
    ovl_always #(`OVL_ERROR, `OVL_ASSERT, "ERROR : 以前のcamc_addr から+4されていない", `OVL_COVER_ALL, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_addr_assertion (clk_ddr2, reset_ddr2, camc_addr>=4 && (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && ddr2_addr_we , camc_addr_1d+4==camc_addr, fire_camc_addr);
    
    // VGA_Display_Controller が有効の時にCamera_Controller がライトしないことをチェックするOVLアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : VGA_Display_Controller が有効の時に、camc_addr_ena, camc_data_ena が1になった", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgac_camc_we_assertion (clk_ddr2, reset_ddr2, 1'b1, (cs_abt==VGADC_Grant || cs_abt==CAMC_Wait) && (ddr2_addr_we || ddr2_addr_we), fire_vgac_camc);
    
    // 現在のVGA_Display_Controller からのRead Addressが以前のRead Addressの+4かどうかをチェックするOVLアサーション
    ovl_always #(`OVL_ERROR, `OVL_ASSERT, "ERROR : 以前のvgadc_addr から+4されていない", `OVL_COVER_ALL, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgadc_addr_assertion (clk_ddr2, reset_ddr2, vgadc_addr>=4 && (cs_abt==CAMC_Grant || cs_abt==VGADC_Wait) && ddr2_addr_we , vgadc_addr_1d+4==vgadc_addr, fire_vgac_addr);
    
    // Camera_Controller がFIFOがフルの時に書き込んでいるか?をチェックするアサーション
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : アドレスFIFOがフルの時にCamera_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_addr_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, ddr2_addr_we && ddr2_addr_fifo_full, fire_camc_addr_overflow);
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : データFIFOがフルの時にCamera_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) camc_data_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, ddr2_data_we && ddr2_wrdata_fifo_full, fire_camc_data_overflow);
    
    // VGA_Display_Controller がFIFOがフルの時に書き込んでいるか?をチェックするアサーション 
    ovl_never #(`OVL_ERROR, `OVL_ASSERT, "ERROR : アドレスFIFOがフルの時にVGA_Display_Controller が書き込んだ", `OVL_COVER_DEFAULT, `OVL_POSEDGE, `OVL_ACTIVE_HIGH, `OVL_GATE_CLOCK) vgadc_data_full_we_assertion (clk_ddr2, reset_ddr2, 1'b1, vgadc_addr_we && ddr2_addr_fifo_full, fire_vgadc_addr_overflow);
    // synthesis translate_on


残念ながら、全部OVLアサーションではできなくて、camc_addr_1dとvgadc_addr_1dをVerilogで作っている。
OVL_assertion_1_100906.png

fire...信号がすべて0でアサーションが発火していないことを示す。
ここで、2番目のovl_alwaysアサーションの camc_addr_1d+4==camc_addr を camc_addr_1d+3==camc_addr に変更して、もう一度シミュレーションを行った。シミュレーション結果を下に示す。
OVL_assertion_2_100906.png

fire_camc_addr が途中で1になったのがわかる。その部分を拡大してみる。
OVL_assertion_3_100906.png

camc_addrが0から4になる時が、アサーションエラーだ。わざとアサーションエラーを出した。うまく動いているようだ。
  1. 2010年09月06日 04:56 |
  2. アサーション事始め
  3. | トラックバック:0
  4. | コメント:0