data out: out
-percolate up: dram_addr_ 32
-percolate up: dram_addr_r_ 1
-percolate down: dram_addr_a 1
-percolate up: dram_isread_ 1
-percolate up: dram_write_data_ 64
-percolate up: dram_write_data_push_ 1
-percolate down: dram_write_data_full 1
-percolate down: dram_read_data 64
-percolate up: dram_read_data_pop_ 1
-percolate down: dram_read_data_empty 1
-percolate down: dram_read_data_latency 2
+percolate up: ddr1_Clk_pin 1
+percolate up: ddr1_Clk_n_pin 1
+percolate up: ddr1_Addr_pin 13
+percolate up: ddr1_BankAddr_pin 2
+percolate up: ddr1_CAS_n_pin 1
+percolate up: ddr1_CE_pin 1
+percolate up: ddr1_CS_n_pin 1
+percolate up: ddr1_RAS_n_pin 1
+percolate up: ddr1_WE_n_pin 1
+percolate up: ddr1_DM_pin 4
+percolate inout: ddr1_DQS 4
+percolate inout: ddr1_DQ 32
== TeX ==============================================================
== FPGA ==============================================================
- reg dram_addr_r;
- reg dram_isread;
- reg dram_write_data_push;
- reg dram_read_data_pop;
+ wire [31:0] dram_addr;
+ wire [31:0] dram_addr__;
+
+ wire dram_addr_a;
+ wire [63:0] dram_write_data;
+ wire [63:0] dram_read_data;
+
+ reg dram_addr_r;
+ reg dram_isread;
+
+ assign dram_addr__ = dram_isread ? inAddrRead_d[31:0] : inAddrWrite_d[31:0];
+ assign dram_addr = { dram_addr__[30:6], 1'b0, dram_addr__[5:0] };
+
reg [`WORDWIDTH:0] out_d;
- wire [31:0] dram_addr__;
-
- assign dram_addr_r_ = dram_addr_r;
- assign dram_isread_ = dram_isread;
- assign dram_addr__ = !dram_isread ? inAddrWrite_d[31:0] : inAddrRead_d[31:0];
- assign dram_addr_ = { dram_addr__[30:6], 1'b0, dram_addr__[5:0] };
- assign dram_write_data_push_ = dram_write_data_push;
- assign dram_read_data_pop_ = dram_read_data_pop;
- assign dram_write_data_ = inDataWrite_d;
-// assign dram_write_data_ = inDataWrite_d[(`WORDWIDTH-1):0];
assign out_d_ = out_d;
+ ddr_ctrl
+ #(
+ .clk_freq( 50000000 ),
+ .clk_multiply( 12 ),
+ .clk_divide( 5 ),
+ .phase_shift( 0 ),
+ .wait200_init( 26 )
+ ) ddr_ctrl (
+ .ddr_a( ddr1_Addr_pin ),
+ .ddr_clk( ddr1_Clk_pin ),
+ .ddr_clk_n( ddr1_Clk_n_pin ),
+ .ddr_ba( ddr1_BankAddr_pin ),
+ .ddr_dq( ddr1_DQ ),
+ .ddr_dm( ddr1_DM_pin ),
+ .ddr_dqs( ddr1_DQS ),
+ .ddr_cs_n( ddr1_CS_n_pin ),
+ .ddr_ras_n( ddr1_RAS_n_pin ),
+ .ddr_cas_n( ddr1_CAS_n_pin ),
+ .ddr_we_n( ddr1_WE_n_pin ),
+ .ddr_cke( ddr1_CE_pin ),
+
+ .clk(clk),
+ .reset(rst),
+ .rot(3'b100),
+
+ .fml_wr(!dram_isread && dram_addr_r),
+ .fml_done(dram_addr_a),
+ .fml_rd( dram_isread && dram_addr_r),
+ .fml_adr(dram_addr),
+ .fml_din(dram_write_data),
+ .fml_dout(dram_read_data),
+ .fml_msk(16'h0)
+ );
+
always @(posedge clk) begin
- if (!rst) begin
+ if (rst) begin
`reset
dram_isread <= 0;
dram_addr_r <= 0;
- dram_read_data_pop <= 0;
end else begin
- `flush
`cleanup
if (dram_addr_r && !dram_addr_a) begin
== Test ========================================================
#skip
+// expected output
+#expect 10
+
+// ships required in order to run this code
+#ship debug : Debug
+#ship memory : DRAM
+
+memory.inAddrWrite:
+ set word=0;
+ deliver;
+ deliver;
+
+memory.inDataWrite:
+ set word=-1;
+ deliver;
+ set word=-1;
+ deliver;
+
+memory.inAddrRead:
+ recv token;
+ set word=0;
+ deliver;
+
+memory.out:
+ collect;
+ collect;
+ send token to memory.inAddrRead;
+ collect;
+ send to debug.in;
+
+debug.in:
+ set ilc=*;
+ recv, deliver;
+
== Constants ========================================================