1 package edu.berkeley.fleet.fpga;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.two.*;
4 import edu.berkeley.fleet.*;
5 import java.lang.reflect.*;
6 import edu.berkeley.sbp.chr.*;
7 import edu.berkeley.sbp.misc.*;
8 import edu.berkeley.sbp.meta.*;
9 import edu.berkeley.sbp.util.*;
12 import static edu.berkeley.fleet.two.FleetTwoFleet.*;
13 import static edu.berkeley.fleet.fpga.verilog.Verilog.*;
15 public class FifoModule extends Module {
18 private boolean doubleSpeed;
19 public FifoModule(int len, int width) { this(len, width, false); }
20 public FifoModule(int len, int width, boolean doubleSpeed) {
21 super("fifo"+len+"x"+width+(doubleSpeed?"_2x":""));
24 this.doubleSpeed = doubleSpeed;
25 Module.SourcePort in = createInputPort("in", width);
26 Module.SinkPort out = createOutputPort("out", width);
27 Module.InstantiatedModule[] stages = new Module.InstantiatedModule[len];
31 if (doubleSpeed) throw new RuntimeException();
32 new Event(new Object[] { in, out },
33 new Action[] { in, out, new AssignAction(out, in) });
35 Module fifo1 = new FifoModule(1,width);
36 for(int i=0; i<=len; i++) {
37 if (i<len) stages[i] = new Module.InstantiatedModule(this, fifo1);
38 Module.SourcePort driver = i==0 ? in : stages[i-1].getOutputPort("out");
39 Module.SinkPort driven = i==len ? out : stages[i].getInputPort("in");
40 driver.connect(driven);
46 for(int i=0; i<32; i++)
49 throw new RuntimeException();
52 public void dump(String prefix) throws IOException {
53 if (len>16) throw new RuntimeException("FifoModule(i>16) not supported due to SRL16 limitation");
56 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(prefix+"/"+name+".v")));
57 pw.println("`define ADDR_BITS "+dislog(len));
58 pw.println("`define WIDTH " + width);
59 pw.println("`define MODULE_NAME "+name);
61 pw.println("`define DELAY 2");
63 pw.println("`define DELAY 5");
65 pw.println("`include \"ramfifo.inc\"");
69 if (doubleSpeed) throw new RuntimeException();