Source file ram_with_byte_enables.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
open Base
open Hardcaml
module type S = Ram_with_byte_enables_intf.S
module Make
(Master_to_slave : Internal_bus_ports.Master_to_slave)
(Slave_to_master : Internal_bus_ports.Slave_to_master) =
struct
open Signal
type t = (Signal.t Slave_to_master.t, unit) Slave_with_data.t [@@deriving sexp_of]
include Internal_bus_utils.Make (Master_to_slave) (Slave_to_master)
let create ~reg_spec ~(master : _ Master_to_slave.t) ~size =
let addr = word_address ~master ~size in
{ Slave_with_data.slave =
create_slave
~read_latency:1
~write_latency:1
~reg_spec
~master
~read_data:
(List.init bytes_per_word ~f:(fun i ->
ram_rbw
size
~write_port:
{ write_clock = Reg_spec.clock reg_spec
; write_address = addr
; write_enable = master.write_first &: bit master.write_byte_en i
; write_data = select master.write_data ((i * 8) + 7) (i * 8)
}
~read_port:
{ read_clock = Reg_spec.clock reg_spec
; read_address = addr
; read_enable = master.read_first
})
|> concat_lsb)
; data = ()
}
;;
end