-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathhiddenMemory.bsv
More file actions
executable file
·73 lines (63 loc) · 2.07 KB
/
Copy pathhiddenMemory.bsv
File metadata and controls
executable file
·73 lines (63 loc) · 2.07 KB
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import FIFO::*;
import SpecialFIFOs::*;
`ifdef MEM_LAT
typedef `MEM_LAT MemLat;
`else
typedef 1 MemLat;
`endif
typedef TSub#(MemLat, 1) NumFIFOs; // deduct 1 latency from bram
// (* synthesize *)
module mkMemory(Memory);
BRAM_Configure cfg = defaultValue();
cfg.loadFormat = tagged Hex "mem.vmh";
BRAM1Port#(Bit#(14), Word) bram <- mkBRAM1Server(cfg);
`ifdef MEM_LAT
Vector#(NumFIFOs, FIFO#(Word)) latChannel <- replicateM(mkPipelineFIFO);
rule doGetResp;
let x <- bram.portA.response.get();
latChannel[0].enq(x);
// $display("bram resp at %t", $time);
endrule
for (Integer i = 0; i < valueOf(NumFIFOs) - 1 ; i=i+1) begin
rule doConection;
let v = latChannel[i].first;
latChannel[i].deq;
latChannel[i+1].enq(v);
endrule
end
`endif
method Action req(MemReq memReq);
if (memReq.op == St) begin
if (memReq.addr == 'h4000_0000) begin
// Writing to STDOUT
$write("%c", memReq.data[7:0]);
end else if (memReq.addr == 'h4000_0004) begin
// Write integer to STDOUT
$write("%0d", memReq.data);
end else if (memReq.addr == 'h4000_1000) begin
// Exiting Simulation
if (memReq.data == 0) begin
$display("PASSED");
end else begin
$display("FAILED %0d", memReq.data);
end
$finish;
end
end
// $display("bram req at %t", $time);
bram.portA.request.put(BRAMRequest{
write: memReq.op == St,
responseOnWrite: False,
address: truncate(memReq.addr >> 2),
datain: memReq.data});
endmethod
method ActionValue#(Word) resp();
`ifdef MEM_LAT
let x = latChannel[valueOf(NumFIFOs)-1].first;
latChannel[valueOf(NumFIFOs)-1].deq;
`else
let x <- bram.portA.response.get();
`endif
return x;
endmethod
endmodule