77// Luca Valente <luca.valente@unibo.it>
88
99module hyperbus # (
10- parameter int unsigned NumChips = - 1 ,
11- parameter int unsigned NumPhys = 2 ,
12- parameter int unsigned IsClockODelayed = 0 ,
13- parameter int unsigned AxiAddrWidth = - 1 ,
14- parameter int unsigned AxiDataWidth = - 1 ,
15- parameter int unsigned AxiIdWidth = - 1 ,
16- parameter int unsigned AxiUserWidth = - 1 ,
17- parameter type axi_req_t = logic ,
18- parameter type axi_rsp_t = logic ,
19- parameter type axi_w_chan_t = logic ,
20- parameter type axi_b_chan_t = logic ,
21- parameter type axi_ar_chan_t = logic ,
22- parameter type axi_r_chan_t = logic ,
23- parameter type axi_aw_chan_t = logic ,
24- parameter int unsigned RegAddrWidth = - 1 ,
25- parameter int unsigned RegDataWidth = - 1 ,
10+ parameter int unsigned NumChips = - 1 ,
11+ parameter int unsigned NumPhys = 2 ,
12+ parameter bit UsePhyClkDivider = 1 ,
13+ parameter int unsigned AxiAddrWidth = - 1 ,
14+ parameter int unsigned AxiDataWidth = - 1 ,
15+ parameter int unsigned AxiIdWidth = - 1 ,
16+ parameter int unsigned AxiUserWidth = - 1 ,
17+ parameter type axi_req_t = logic ,
18+ parameter type axi_rsp_t = logic ,
19+ parameter type axi_w_chan_t = logic ,
20+ parameter type axi_b_chan_t = logic ,
21+ parameter type axi_ar_chan_t = logic ,
22+ parameter type axi_r_chan_t = logic ,
23+ parameter type axi_aw_chan_t = logic ,
24+ parameter int unsigned RegAddrWidth = - 1 ,
25+ parameter int unsigned RegDataWidth = - 1 ,
2626 parameter int unsigned MinFreqMHz = 100 ,
27- parameter type reg_req_t = logic ,
28- parameter type reg_rsp_t = logic ,
29- parameter type axi_rule_t = logic ,
27+ parameter type reg_req_t = logic ,
28+ parameter type reg_rsp_t = logic ,
29+ parameter type axi_rule_t = logic ,
3030 // The below have sensible defaults, but should be set on integration!
31- parameter int unsigned RxFifoLogDepth = 3 ,
32- parameter int unsigned TxFifoLogDepth = 3 ,
31+ parameter int unsigned RxFifoLogDepth = 3 ,
32+ parameter int unsigned TxFifoLogDepth = 3 ,
3333 parameter logic [RegDataWidth- 1 : 0 ] RstChipBase = 'h0 , // Base address for all chips
3434 parameter logic [RegDataWidth- 1 : 0 ] RstChipSpace = 'h1_0000 , // 64 KiB: Current maximum HyperBus device size
3535 parameter hyperbus_pkg :: hyper_cfg_t RstCfg = hyperbus_pkg :: gen_RstCfg(NumPhys,MinFreqMHz),
3636 parameter int unsigned PhyStartupCycles = 300 * 200 , /* us*MHz */ // Conservative maximum frequency estimate
3737 parameter int unsigned SyncStages = 2
3838) (
3939 input logic clk_phy_i,
40+ `ifdef TARGET_XILINX
41+ input logic clk_ref200_i, // only used for Xilinx delay lines
42+ `endif
4043 input logic rst_phy_ni,
4144 input logic clk_sys_i,
4245 input logic rst_sys_ni,
@@ -79,7 +82,7 @@ module hyperbus #(
7982 } tf_cdc_t ;
8083
8184
82- logic clk_phy_i_0, clk_phy_i_90 , rst_phy;
85+ logic clk_phy_0, clk_phy_90 , rst_phy;
8386
8487 // Register file
8588 hyperbus_pkg :: hyper_cfg_t cfg;
@@ -178,18 +181,37 @@ module hyperbus #(
178181 .trans_active_o ( trans_active )
179182 );
180183
184+ if (UsePhyClkDivider == 1'b1 ) begin : clock_generator
185+ hyperbus_clk_gen ddr_clk (
186+ .clk_i ( clk_phy_i ),
187+ .rst_ni ( rst_phy_ni ),
188+ .clk0_o ( clk_phy_0 ),
189+ .clk90_o ( clk_phy_90 ),
190+ .clk180_o ( ),
191+ .clk270_o ( ),
192+ .rst_no ( rst_phy )
193+ );
194+ end else begin
195+ assign clk_phy_0 = clk_phy_i;
196+ assign clk_phy_90 = '0 ;
197+ assign rst_phy = rst_phy_ni;
198+ end
199+
181200 hyperbus_phy_if # (
182- .IsClockODelayed ( IsClockODelayed ),
183- .NumChips ( NumChips ),
184- .StartupCycles ( PhyStartupCycles ),
185- .NumPhys ( NumPhys ),
186- .hyper_rx_t ( hyper_rx_t ),
187- .hyper_tx_t ( hyper_tx_t ),
188- .SyncStages ( SyncStages )
201+ .UsePhyClkDivider ( UsePhyClkDivider ),
202+ .NumChips ( NumChips ),
203+ .NumPhys ( NumPhys ),
204+ .StartupCycles ( PhyStartupCycles ),
205+ .hyper_rx_t ( hyper_rx_t ),
206+ .hyper_tx_t ( hyper_tx_t ),
207+ .SyncStages ( SyncStages )
189208 ) i_phy (
190- .clk_i ( clk_phy_i_0 ),
191- .clk_i_90 ( clk_phy_i_90 ),
192- .rst_ni ( rst_phy ),
209+ .clk_phy_i ( clk_phy_0 ),
210+ .clk_phy_i_90 ( clk_phy_90 ),
211+ `ifdef TARGET_XILINX
212+ .clk_ref200_i ( clk_ref200_i ),
213+ `endif
214+ .rst_phy_ni ( rst_phy ),
193215 .test_mode_i ( test_mode_i ),
194216
195217 .cfg_i ( cfg ),
@@ -230,7 +252,7 @@ module hyperbus #(
230252 .src_ready_o ( axi_trans_ready ),
231253
232254 .dst_rst_ni ( rst_phy ),
233- .dst_clk_i ( clk_phy_i_0 ),
255+ .dst_clk_i ( clk_phy_0 ),
234256 .dst_data_o ( phy_tf_cdc ),
235257 .dst_valid_o ( phy_trans_valid ),
236258 .dst_ready_i ( phy_trans_ready )
@@ -240,7 +262,7 @@ module hyperbus #(
240262 .T ( logic )
241263 ) i_cdc_2phase_b (
242264 .src_rst_ni ( rst_phy ),
243- .src_clk_i ( clk_phy_i_0 ),
265+ .src_clk_i ( clk_phy_0 ),
244266 .src_data_i ( phy_b_error ),
245267 .src_valid_i ( phy_b_valid ),
246268 .src_ready_o ( phy_b_ready ),
@@ -264,7 +286,7 @@ module hyperbus #(
264286 .src_ready_o ( axi_tx_ready ),
265287
266288 .dst_rst_ni ( rst_phy ),
267- .dst_clk_i ( clk_phy_i_0 ),
289+ .dst_clk_i ( clk_phy_0 ),
268290 .dst_data_o ( phy_tx ),
269291 .dst_valid_o ( phy_tx_valid ),
270292 .dst_ready_i ( phy_tx_ready )
@@ -276,7 +298,7 @@ module hyperbus #(
276298 .LOG_DEPTH ( RxFifoLogDepth )
277299 ) i_cdc_fifo_rx (
278300 .src_rst_ni ( rst_phy ),
279- .src_clk_i ( clk_phy_i_0 ),
301+ .src_clk_i ( clk_phy_0 ),
280302 .src_data_i ( phy_rx ),
281303 .src_valid_i ( phy_rx_valid ),
282304 .src_ready_o ( phy_rx_ready ),
@@ -288,27 +310,5 @@ module hyperbus #(
288310 .dst_ready_i ( axi_rx_ready )
289311 );
290312
291- // Shift clock by 90 degrees
292- generate
293- if (IsClockODelayed== 0 ) begin : clock_generator
294- hyperbus_clk_gen ddr_clk (
295- .clk_i ( clk_phy_i ),
296- .rst_ni ( rst_phy_ni ),
297- .clk0_o ( clk_phy_i_0 ),
298- .clk90_o ( clk_phy_i_90 ),
299- .clk180_o ( ),
300- .clk270_o ( ),
301- .rst_no ( rst_phy )
302- );
303- end else if (IsClockODelayed== 1 ) begin
304- assign clk_phy_i_0 = clk_phy_i;
305- assign rst_phy = rst_phy_ni;
306- hyperbus_delay i_delay_tx_clk_90 (
307- .in_i ( clk_phy_i_0 ),
308- .delay_i ( cfg.t_tx_clk_delay ),
309- .out_o ( clk_phy_i_90 )
310- );
311- end
312- endgenerate
313313
314314endmodule : hyperbus
0 commit comments