OpenCores
URL https://opencores.org/ocsvn/bluespec-h264/bluespec-h264/trunk

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [src_fpga/] [SRAM.bsv] - Rev 100

Compare with Previous | Blame | View Log


// The MIT License

// Copyright (c) 2006-2007 Massachusetts Institute of Technology

// 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.

import FIFO::*;

interface SRAM#(type idx_type, type data_type);
 
  method Action read_req(idx_type idx);

  method ActionValue#(data_type) read_resp();

  method Action write(idx_type idx, data_type data);
  

  method Bit#(18) address_out();
  method Bit#(32) data_out();
  method Action data_in(Bit#(32) data);
  method Bit#(1) data_tri();
  method Bit#(4) we_bytes_out();
  method Bit#(1) we_out();
  method Bit#(1) ce_out();
  method Bit#(1) oe_out();
  method Bit#(1) cen_out();
  method Bit#(1) adv_ld_out();

endinterface


module mkSRAM#(Integer low, Integer high) 
  //interface:
              (SRAM#(idx_type, data_type))
  provisos
          (Bits#(idx_type, idx),
           Bitwise#(idx_type), 
           Bits#(data_type, data),
           Bitwise#(data_type),
           Literal#(data_type),
           Literal#(idx_type));
           
  SRAM#(idx_type, data_type) m <- (valueof(data) == 0) ? 
                                   mkSRAM_Zero() :
                                   mkSRAM_NonZero(low, high);

  return m;
endmodule

import "BVI" SRAM = module mkSRAM_NonZero#(Integer low, Integer high) 
  //interface:
              (SRAM#(idx_type, data_type))
  provisos
          (Bits#(idx_type, idx),
           Bitwise#(idx_type), 
           Bits#(data_type, data),
           Bitwise#(data_type),
           Literal#(data_type),
           Literal#(idx_type));

  default_clock clk(CLK);
  default_reset rst(RST_N);

  parameter addr_width = valueof(idx);
  parameter data_width = valueof(data);
  parameter lo = low;
  parameter hi = high;

  method DOUT read_resp() ready(DOUT_RDY) enable(DOUT_EN);
  
  method read_req(RD_ADDR) ready(RD_RDY) enable(RD_EN);
  method write(WR_ADDR, WR_VAL) enable(WR_EN);

  // All of these are physical wires and therefore always enabled/ready
  method ADDR_O address_out();
  method DATA_BUS_O data_out();
  method data_in(DATA_BUS_I) enable((*inhigh*) DUMMY_EN) ;
  method DATA_BUS_T data_tri();
  method WE_BYTES_N_O we_bytes_out();
  method WE_N_O we_out();
  method CE_N_O ce_out();
  method OE_N_O oe_out();
  method CEN_N_O cen_out();
  method ADV_LD_N_O adv_ld_out();

  schedule read_req  CF read_resp;
  schedule read_resp CF (read_req, write);
  schedule write     CF read_resp;
  schedule (read_req, write, read_resp) CF (address_out, data_out, data_in, data_tri, 
                                            we_bytes_out, we_out, ce_out, oe_out,
                                            cen_out, adv_ld_out);
  schedule (address_out, data_out, data_in, data_tri, 
            we_bytes_out, we_out, ce_out, oe_out,
            cen_out, adv_ld_out)
           CF 
           (address_out, data_out, data_in, data_tri, 
            we_bytes_out, we_out, ce_out, oe_out,
            cen_out, adv_ld_out, read_req, write, read_resp);

  //It may be dangerous not to have data_in conflict with itself.  
  schedule data_in   C data_in;
  schedule read_req  C (read_req, write);
  schedule read_resp C read_resp;
  schedule write     C (write, read_req);

endmodule

module mkSRAM_Zero
  //interface:
              (SRAM#(idx_type, data_type))
    provisos
          (Bits#(idx_type, idx),
           Bitwise#(idx_type), 
           Bits#(data_type, data),
           Bitwise#(data_type),
           Literal#(data_type),
           Literal#(idx_type));
  
  FIFO#(data_type) q <- mkSizedFIFO(4);

  method Action read_req(idx_type i);
     q.enq(?);
  endmethod

  method Action write(idx_type i, data_type d);
    noAction;
  endmethod

  method ActionValue#(data_type) read_resp();
    q.deq();
    return q.first();
  endmethod

  method Bit#(18) address_out();
    return ~0;
  endmethod

  method Bit#(32) data_out();
    return ~0;
  endmethod

  method Action data_in(Bit#(32) data);
    noAction;
  endmethod

  method Bit#(1) data_tri();
    return ~0;
  endmethod

  method Bit#(4) we_bytes_out();
    return ~0;
  endmethod

  method Bit#(1) we_out();
    return ~0;
  endmethod

  method Bit#(1) ce_out();
    return ~0;
  endmethod

  method Bit#(1) oe_out();
    return ~0;
  endmethod

  method Bit#(1) cen_out();
    return ~0;
  endmethod

  method Bit#(1) adv_ld_out();  
    return ~0;
  endmethod
endmodule

module mkSRAM_Full 
  //interface:
              (SRAM#(idx_type, data_type))
  provisos
          (Bits#(idx_type, idx),
           Bitwise#(idx_type), 
           Bits#(data_type, data),
           Bitwise#(data_type),
           Literal#(data_type),
           Literal#(idx_type));

  SRAM#(idx_type, data_type) br <- mkSRAM(0, valueof(TExp#(idx)) - 1);

  return br;

endmodule

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.