1 // This file is Copyright (c) 2020 LambdaConcept <contact@lambdaconcept.com>
6 //parameter simticks = 70000;
7 parameter simticks = 60000000;
9 // GSR & PUR init requires for Lattice models
23 // Generate 100 Mhz clock
44 wire [1:0] dram_dqs_n;
49 wire [1:0] dram_tdqs_n;
71 .ddr3_0__dq__io(dram_dq),
72 .ddr3_0__dqs__io(dram_dqs),
73 .ddr3_0__clk__io(dram_ck),
74 .ddr3_0__clk_en__io(dram_cke),
75 .ddr3_0__we_n__io(dram_we_n),
76 .ddr3_0__ras_n__io(dram_ras_n),
77 .ddr3_0__cas_n__io(dram_cas_n),
78 .ddr3_0__a__io(dram_a),
79 .ddr3_0__ba__io(dram_ba),
80 .ddr3_0__dm__io(dram_dm),
81 .ddr3_0__odt__io(dram_odt),
84 .uart_0__rx__io(uart_rx),
85 .uart_0__tx__io(uart_tx)
90 $dumpfile("simsoc.fst");
92 $dumpvars(0, dram_dq);
93 $dumpvars(0, dram_dqs);
94 $dumpvars(0, dram_ck);
95 $dumpvars(0, dram_cke);
96 $dumpvars(0, dram_we_n);
97 $dumpvars(0, dram_ras_n);
98 $dumpvars(0, dram_cas_n);
100 $dumpvars(0, dram_ba);
101 $dumpvars(0, dram_dm);
102 $dumpvars(0, dram_odt);
103 $dumpvars(0, uart_rx);
104 $dumpvars(0, uart_tx);
105 $dumpvars(0, simsoctop);
115 $display("[%t] Starting POR",$time);
116 #700000; // POR is ~700us
117 $display("[%t] POR complete",$time);
120 wishbone_write(32'h00009000 >> 2, 8'h0E); // DFII_CONTROL_ODT|DFII_CONTROL_RESET_N|DFI_CONTROL_CKE
122 wishbone_write(32'h0000900c >> 2, 32'h0); // p0 address
123 wishbone_write(32'h00009010 >> 2, 32'h0); // p0 baddress
124 wishbone_write(32'h00009000 >> 2, 8'h0C); // DFII_CONTROL_ODT|DFII_CONTROL_RESET_N
126 wishbone_write(32'h00009000 >> 2, 8'h0E); // DFII_CONTROL_ODT|DFII_CONTROL_RESET_N|DFI_CONTROL_CKE
130 wishbone_write(32'h0000900c >> 2, 32'h200); // p0 address
131 wishbone_write(32'h00009010 >> 2, 32'h2); // p0 baddress
132 wishbone_write(32'h00009004 >> 2, 8'h0F); // RAS|CAS|WE|CS
133 wishbone_write(32'h00009008 >> 2, 8'h01); // Command issue strobe
136 wishbone_write(32'h0000900c >> 2, 32'h0); // p0 address
137 wishbone_write(32'h00009010 >> 2, 32'h3); // p0 baddress
138 wishbone_write(32'h00009004 >> 2, 8'h0F); // RAS|CAS|WE|CS
139 wishbone_write(32'h00009008 >> 2, 8'h01); // Command issue strobe
142 wishbone_write(32'h0000900c >> 2, 32'h6); // p0 address
143 wishbone_write(32'h00009010 >> 2, 32'h1); // p0 baddress
144 wishbone_write(32'h00009004 >> 2, 8'h0F); // RAS|CAS|WE|CS
145 wishbone_write(32'h00009008 >> 2, 8'h01); // Command issue strobe
148 wishbone_write(32'h0000900c >> 2, 32'h320); // p0 address
149 wishbone_write(32'h00009010 >> 2, 32'h0); // p0 baddress
150 wishbone_write(32'h00009004 >> 2, 8'h0F); // RAS|CAS|WE|CS
151 wishbone_write(32'h00009008 >> 2, 8'h01); // Command issue strobe
155 wishbone_write(32'h0000900c >> 2, 32'h400); // p0 address (A10=1)
156 wishbone_write(32'h00009010 >> 2, 32'h0); // p0 baddress
157 wishbone_write(32'h00009004 >> 2, 8'h03); // WE|CS
158 wishbone_write(32'h00009008 >> 2, 8'h01); // Command issue strobe
162 wishbone_write(32'h00009000 >> 2, 8'h01); // DFII_CONTROL_SEL
166 wishbone_write(32'h10000000 >> 2, 32'h12345678);
168 wishbone_write(32'h10000100 >> 2, 32'h00000000);
170 wishbone_read(32'h10000000 >> 2, tmp);
174 input [31:0] address;
178 uart_send(8'h01); // Write command
179 uart_send(8'h01); // Length
180 uart_send(address[31:24]); // Address
181 uart_send(address[23:16]);
182 uart_send(address[15:8]);
183 uart_send(address[7:0]);
184 uart_send(value[31:24]);
185 uart_send(value[23:16]);
186 uart_send(value[15:8]);
187 uart_send(value[7:0]);
192 input [31:0] address;
196 uart_send(8'h02); // Read command
197 uart_send(8'h01); // Length
198 uart_send(address[31:24]); // Address
199 uart_send(address[23:16]);
200 uart_send(address[15:8]);
201 uart_send(address[7:0]);
202 uart_read(value[31:24]);
203 uart_read(value[23:16]);
204 uart_read(value[15:8]);
205 uart_read(value[7:0]);
216 for (i = 0; i < 8; i = i + 1)
236 for (i = 0; i < 8; i = i+1)
238 #8680 data[i] <= uart_tx;