亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hssdrc_driver_class.sv

?? SDRAM 控制器 Verilog實現
?? SV
字號:
//
// Project      : High-Speed SDRAM Controller with adaptive bank management and command pipeline
// 
// Project Nick : HSSDRC
// 
// Version      : 1.0-beta 
//  
// Revision     : $Revision: 1.1 $ 
// 
// Date         : $Date: 2008-03-06 13:54:00 $ 
// 
// Workfile     : hssdrc_driver_class.sv
// 
// Description  : low level API driver for hssdrc_controller
// 
// HSSDRC is licensed under MIT License
// 
// Copyright (c) 2007-2008, Denis V.Shekhalev (des00@opencores.org) 
// 
// Permission  is hereby granted, free of charge, to any person obtaining a copy of
// this  software  and  associated documentation files (the "Software"), to deal in
// the  Software  without  restriction,  including without limitation the rights to
// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
// the  Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
// 
// The  above  copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
// 
// THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
// FOR  A  PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
// COPYRIGHT  HOLDERS  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
// IN  AN  ACTION  OF  CONTRACT,  TORT  OR  OTHERWISE,  ARISING  FROM, OUT OF OR IN
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//



`include "hssdrc_tb_sys_if.vh"

`include "hssdrc_define.vh"

`include "tb_define.svh"

`include "hssrdc_driver_cbs_class.sv"

`ifndef __HSSDRC_DRIVER_SV__

  `define __HSSDRC_DRIVER_SV__

  class hssrdc_driver_class; 
  
    // callback quene 
    hssrdc_driver_cbs_class cbs[$];
  
    // mailboxes to connect with transaction agent
    sdram_tr_mbx in_mbx; 
  
    // mailbox for connect command path with data path of this driver   
    sdram_tr_mbx wdata_mbx;
    sdram_tr_mbx rdata_mbx; 
  
    // 
    virtual hssdrc_tb_sys_if sys_if;
  
    // acknowledge mailbox for agent. used in locked transaction only 
    sdram_tr_ack_mbx done_mbx; 

    // feedback to tb for waiting event 
    event write_done; 
    event read_done; 

    // driver work modes 
    bit random_delay_mode = 0;
    bit debug             = 0;

    //
    //
    //

    function new (virtual hssdrc_tb_sys_if sys_if,  sdram_tr_mbx in_mbx, sdram_tr_ack_mbx done_mbx);
  
      this.sys_if   = sys_if;
  
      this.in_mbx   = in_mbx;
  
      this.done_mbx = done_mbx;
  
      // internal not sized mailboxes : all must be controlled via in_mbx, out_mbx size
      wdata_mbx = new; 
      rdata_mbx = new;
      
    endfunction
  
    //
    // init interface task 
    //

    task init; 
      sys_if.cb.write   <= 1'b0;
      sys_if.cb.read    <= 1'b0;
      sys_if.cb.refr    <= 1'b0; 
      sys_if.cb.cola    <= '0;
      sys_if.cb.rowa    <= '0;
      sys_if.cb.ba      <= '0;
      sys_if.cb.chid_i  <= '0;
      sys_if.cb.burst   <= '0;
      sys_if.cb.wdata   <= '0;
      sys_if.cb.wdatam  <= '0;    
    endtask

    //
    // start driver task 
    // 

    task run; 
      init ();
      fork 
        CommandDriver   (); 
        WriteDataDriver (); 
        ReadDataDriver  ();
      join_none; 
    endtask

    //
    // stop driver task 
    // 

    task stop (); 
      disable this.CommandDriver;
      disable this.WriteDataDriver;
      disable this.ReadDataDriver;
    endtask

    //-----------------------------------------------------------------------
    // command driver 
    //-----------------------------------------------------------------------

    task CommandDriver; 
      sdram_transaction_class tr; 
  
      bit [4:0] delay;  // max delay is 32 bit 
      
    begin     
  
      @(sys_if.cb); 
      forever begin
  
        // syncronize mailbox to clock 
        if ( !in_mbx.try_get(tr) ) begin 
          @(sys_if.cb); 
          continue;
        end 
  
        if (debug) begin 
          if ((tr.tr_type == cTR_READ) || (tr.tr_type == cTR_READ_LOCKED)) 
            $display("%0t cmd get READ transaction id = %0d", $time, tr.id);
          else if ((tr.tr_type == cTR_WRITE) || (tr.tr_type == cTR_WRITE_LOCKED))
            $display("%0t cmd get WRITE transaction id = %0d", $time, tr.id);
        end  
  
        if (random_delay_mode) begin
          assert (std::randomize(delay) with {delay dist {0 := 1, !0 :/ 2};}) else 
            $error ("random delay generate error");
          
          repeat (delay) @(sys_if.cb);
        end
        
        
        // set command on interface
        SetCommand(tr);
  
        // if need callbacks
        foreach ( cbs [i] ) cbs[i].post_Command ($realtime);
  
        // set command for write/read drivers
        case (tr.tr_type)
          cTR_WRITE, cTR_WRITE_LOCKED : wdata_mbx.put (tr);
          cTR_READ , cTR_READ_LOCKED  : rdata_mbx.put (tr);
        endcase
  
        // for locked transactions wait done and set acknowledge
        case (tr.tr_type)
          cTR_WRITE_LOCKED : begin
            @(write_done);
            done_mbx.put (cTR_WRITE_LOCKED);
          end
          cTR_READ_LOCKED  : begin
            @(read_done);
            done_mbx.put(cTR_READ_LOCKED);
          end
          cTR_REFR_LOCKED : begin
            done_mbx.put (cTR_WRITE_LOCKED);
          end
        endcase
  
      end
    end 
    endtask
  
    //
    //
    //
  
    task SetCommand (sdram_transaction_class tr); 
  
      case (tr.tr_type)
        cTR_WRITE, cTR_WRITE_LOCKED : begin 
          sys_if.cb.write <= 1'b1;
          sys_if.cb.read  <= 1'b0;
          sys_if.cb.refr  <= 1'b0;
        end 
        cTR_READ,  cTR_READ_LOCKED  : begin 
          sys_if.cb.write <= 1'b0;
          sys_if.cb.read  <= 1'b1;
          sys_if.cb.refr  <= 1'b0;
        end 
        cTR_REFR,  cTR_REFR_LOCKED  : begin 
          sys_if.cb.write <= 1'b0;
          sys_if.cb.read  <= 1'b0;
          sys_if.cb.refr  <= 1'b1;
        end 
      endcase
  
      sys_if.cb.rowa    <= tr.rowa;
      sys_if.cb.cola    <= tr.cola;
      sys_if.cb.ba      <= tr.ba;
      sys_if.cb.burst   <= tr.burst;
      sys_if.cb.chid_i  <= tr.chid;
     
      do
        @(sys_if.cb);
      while (sys_if.cb.ready != 1'b1);
  
      sys_if.cb.write <= 1'b0;
      sys_if.cb.read  <= 1'b0;
      sys_if.cb.refr  <= 1'b0;
  
    endtask 
  
    //-----------------------------------------------------------------------
    // write data  driver 
    //-----------------------------------------------------------------------

    task WriteDataDriver; 
  
      sdram_transaction_class tr; 
      int num;    
  
    begin 
  
      forever begin
        wdata_mbx.get (tr);
  
        if (debug) 
          $display("%0t write driver get transaction id = %0d", $time, tr.id);
  
        num = tr.burst + 1;
  
        // set data
        for (int i = 0; i < num; i++) 
          SetWrData (tr.wdata [i] , tr.wdatam [i]);        
  
        -> write_done;
  
        if (debug) 
          $display("%0t write driver done transaction id = %0d", $time, tr.id);
  
        foreach ( cbs[i] ) cbs[i].post_WriteData($realtime, tr);
  
      end
    end 
    endtask

    //
    //
    //
`ifndef HSSDRC_COMBINATIVE_USE_WDATA
    task SetWrData ( input data_t data, datam_t datam); 
      sys_if.cb.wdata   <= data;
      sys_if.cb.wdatam  <= datam;
  
      do
        @(sys_if.cb);
      while (sys_if.cb.use_wdata != 1'b1);
    endtask
`else 
    task SetWrData ( input data_t data, datam_t datam); 
      do
        @(sys_if.cb);
      while (sys_if.cb.use_wdata != 1'b1);

      sys_if.cb.wdata   <= data;
      sys_if.cb.wdatam  <= datam;  
    endtask
`endif 
    //-----------------------------------------------------------------------
    // read part of  driver 
    //-----------------------------------------------------------------------

    task ReadDataDriver;
  
      sdram_transaction_class tr;
      int num;
  
    begin
      forever begin
        rdata_mbx.get (tr);
  
        if (debug) 
          $display("%0t read driver get transaction id = %0d", $time, tr.id);
  
        num = tr.burst + 1;
  
        for (int i = 0; i < num; i++)
            GetRdData (tr.rdata [i], tr.rchid [i]);
  
        -> read_done;
  
        if (debug) 
          $display("%0t read driver done transaction id = %0d", $time, tr.id);
  
        foreach ( cbs[i] ) cbs[i].post_ReadData($realtime, tr);
  
      end
    end
    endtask

    //
    //
    //

    task GetRdData (output data_t data, chid_t chid);
  
      do
        @(sys_if.cb);
      while (sys_if.cb.vld_rdata != 1'b1);
  
      data = sys_if.cb.rdata;
      chid = sys_if.cb.chid_o;
  
    endtask
  
    //
    //
    //
    
  endclass 

`endif 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色视频成人在线观看免| 久久精品国产一区二区三| 国产一区二区看久久| 色美美综合视频| 久久亚洲精品国产精品紫薇| 日日夜夜免费精品视频| 在线视频欧美精品| 中文字幕一区在线观看| 国产乱人伦精品一区二区在线观看| 在线播放欧美女士性生活| 亚洲日本成人在线观看| 高清成人免费视频| 26uuu成人网一区二区三区| 日韩va亚洲va欧美va久久| 欧洲精品视频在线观看| 1024成人网| 成人av中文字幕| 国产亚洲短视频| 韩国av一区二区三区在线观看| 91精品福利在线一区二区三区| 洋洋成人永久网站入口| 91欧美一区二区| 亚洲人成电影网站色mp4| 成人国产精品免费观看| 中文字幕不卡在线| 国产精品99久久久久久久vr| 久久亚洲一区二区三区明星换脸| 久久99精品久久久| 精品va天堂亚洲国产| 久久福利视频一区二区| 精品国产乱码久久久久久1区2区| 男女视频一区二区| 欧美一区二区三区啪啪| 免费不卡在线视频| 日韩一区二区在线看| 麻豆精品国产91久久久久久| 欧美一级理论片| 美女网站视频久久| 精品国产一区二区三区不卡| 国产一区二区三区蝌蚪| 国产日韩欧美制服另类| 国产91精品露脸国语对白| 欧美国产1区2区| 99re亚洲国产精品| 亚洲黄色性网站| 欧美日韩精品免费| 日韩一区精品视频| 欧美videossexotv100| 精品一区二区三区免费| 久久久久九九视频| 成人a免费在线看| 亚洲免费电影在线| 欧美日韩国产一级| 色综合天天做天天爱| 国产精品毛片无遮挡高清| 97久久精品人人做人人爽| 亚洲一区二区精品久久av| 欧美蜜桃一区二区三区| 久久99精品国产91久久来源| 国产午夜精品一区二区三区视频 | 亚洲欧美一区二区三区国产精品 | 色综合久久久久久久久| 亚洲国产日韩av| 日韩欧美电影一区| 粉嫩绯色av一区二区在线观看| 日韩一区中文字幕| 欧美日韩一级片在线观看| 麻豆视频一区二区| 国产丝袜在线精品| 在线亚洲高清视频| 麻豆国产欧美日韩综合精品二区 | 综合色中文字幕| 欧美日韩国产片| 国内国产精品久久| 亚洲男人的天堂在线观看| 欧美日韩电影在线播放| 精品一区二区免费在线观看| 亚洲欧美一区二区在线观看| 欧美精品九九99久久| 国产91精品精华液一区二区三区 | 黄一区二区三区| 一区精品在线播放| 欧美一区二区网站| 国产91色综合久久免费分享| 亚洲第一主播视频| 国产视频一区在线观看 | 国产成人高清在线| 亚洲制服丝袜av| 久久这里只精品最新地址| 91黄色激情网站| 国产在线精品视频| 亚洲成人www| 国产精品乱码人人做人人爱| 91精品午夜视频| 91网站在线观看视频| 精油按摩中文字幕久久| 一区二区不卡在线视频 午夜欧美不卡在| 欧美一区二区久久久| 97精品国产97久久久久久久久久久久| 日本午夜精品视频在线观看 | 国产精品拍天天在线| 美女网站色91| 久久综合五月天婷婷伊人| 99精品国产热久久91蜜凸| 日韩精品每日更新| 中文字幕一区二区三区色视频| 538在线一区二区精品国产| 播五月开心婷婷综合| 寂寞少妇一区二区三区| 亚洲成人中文在线| 中文字幕中文字幕在线一区| 精品久久久久久无| 欧美日韩综合不卡| 色综合天天综合狠狠| 国产精品77777| 日本特黄久久久高潮| 伊人性伊人情综合网| 国产精品美女久久福利网站| 精品国产免费一区二区三区香蕉| 欧美日韩精品专区| 一本到不卡免费一区二区| 高潮精品一区videoshd| 久久精品国产99| 午夜激情一区二区| 亚洲狠狠丁香婷婷综合久久久| 日本一区二区三区dvd视频在线| 欧美电影免费观看高清完整版| 欧美色图12p| 色吧成人激情小说| 91香蕉视频mp4| av一区二区不卡| 成人精品小蝌蚪| 国产成人小视频| 国产乱人伦偷精品视频不卡| 久久超碰97人人做人人爱| 日本成人中文字幕| 午夜亚洲福利老司机| 亚洲第一精品在线| 亚洲国产视频一区| 亚洲尤物视频在线| 亚洲制服丝袜在线| 亚洲午夜精品17c| 亚洲一区二区三区自拍| 一区二区三区四区在线播放| 亚洲视频在线一区| 亚洲人成影院在线观看| 欧美日韩国产一二三| 欧美放荡的少妇| 91精品国产91久久久久久一区二区| 欧美精品黑人性xxxx| 69堂成人精品免费视频| 欧美日韩精品免费观看视频| 欧美日韩国产色站一区二区三区| 欧美日韩高清影院| 91精品国产91久久久久久一区二区 | 日韩欧美国产综合在线一区二区三区| 欧美二区在线观看| 日韩欧美在线网站| 精品av久久707| 国产日韩欧美一区二区三区乱码| 国产三级久久久| 中文字幕人成不卡一区| 亚洲色图视频网站| 亚洲一二三区视频在线观看| 亚洲午夜久久久久| 日韩1区2区日韩1区2区| 久久99最新地址| 国产成人精品网址| av一二三不卡影片| 欧美午夜免费电影| 日韩亚洲电影在线| 国产日韩精品一区| 亚洲欧美日韩久久| 亚洲国产aⅴ天堂久久| 全国精品久久少妇| 国产精品亚洲专一区二区三区 | 国产精品综合一区二区| 懂色av中文字幕一区二区三区 | 韩国一区二区三区| 国产·精品毛片| 色av一区二区| 日韩美女在线视频| 欧美韩国日本一区| 国产福利一区在线| 日本高清免费不卡视频| 91精品国产综合久久久久久 | 欧美一区二区在线视频| 精品欧美久久久| 一区精品在线播放| 婷婷开心激情综合| 国产麻豆成人传媒免费观看| 91在线国内视频| 欧美一区二区三区电影| 国产丝袜欧美中文另类| 亚洲一区二区黄色| 国产综合一区二区| 色先锋资源久久综合| 日韩欧美成人激情| 亚洲视频中文字幕| 九一九一国产精品|