1 //**************************************************************************
\r
2 // *************************************************************************
\r
3 // * LATTICE SEMICONDUCTOR CONFIDENTIAL *
\r
4 // * PROPRIETARY NOTE *
\r
6 // * This software contains information confidential and proprietary *
\r
7 // * to Lattice Semiconductor Corporation. It shall not be reproduced *
\r
8 // * in whole or in part, or transferred to other documents, or disclosed *
\r
9 // * to third parties, or used for any purpose other than that for which *
\r
10 // * it was obtained, without the prior written consent of Lattice *
\r
11 // * Semiconductor Corporation. All rights reserved. *
\r
13 // *************************************************************************
\r
14 //**************************************************************************
\r
16 `timescale 1ns/100ps
\r
18 module register_interface_hb (
\r
36 mr_stat_1000base_x_fd,
\r
37 mr_stat_1000base_x_hd,
\r
38 mr_stat_1000base_t_fd,
\r
39 mr_stat_1000base_t_hd,
\r
42 mr_stat_100base_x_fd,
\r
43 mr_stat_100base_x_hd,
\r
46 mr_stat_100base_t2_fd,
\r
47 mr_stat_100base_t2_hd,
\r
49 mr_stat_extended_stat,
\r
50 mr_stat_unidir_able,
\r
51 mr_stat_preamb_supr,
\r
52 mr_stat_an_complete,
\r
53 mr_stat_remote_fault,
\r
57 mr_stat_extended_cap,
\r
85 input [7:0] hdatain;
\r
87 output [7:0] hdataout;
\r
90 input mr_stat_1000base_x_fd;
\r
91 input mr_stat_1000base_x_hd;
\r
92 input mr_stat_1000base_t_fd;
\r
93 input mr_stat_1000base_t_hd;
\r
95 input mr_stat_100base_t4;
\r
96 input mr_stat_100base_x_fd;
\r
97 input mr_stat_100base_x_hd;
\r
98 input mr_stat_10mbps_fd;
\r
99 input mr_stat_10mbps_hd;
\r
100 input mr_stat_100base_t2_fd;
\r
101 input mr_stat_100base_t2_hd;
\r
103 input mr_stat_extended_stat;
\r
104 input mr_stat_unidir_able;
\r
105 input mr_stat_preamb_supr;
\r
106 input mr_stat_an_complete;
\r
107 input mr_stat_remote_fault;
\r
108 input mr_stat_an_able;
\r
109 input mr_stat_link_stat;
\r
110 input mr_stat_jab_det;
\r
111 input mr_stat_extended_cap;
\r
114 input [15:0] mr_lp_adv_ability;
\r
116 output mr_main_reset;
\r
117 output mr_loopback_enable;
\r
118 output [1:0] mr_speed_selection;
\r
119 output mr_an_enable;
\r
120 output mr_power_down;
\r
122 output mr_restart_an;
\r
123 output mr_duplex_mode;
\r
124 output mr_col_test;
\r
125 output mr_unidir_enable;
\r
126 output [15:0] mr_adv_ability;
\r
132 .gbe_mode (gbe_mode),
\r
133 .sgmii_mode (sgmii_mode),
\r
136 .hwrite_n (hwrite_n),
\r
138 .hdatain (hdatain),
\r
140 .hdataout (hdataout),
\r
141 .hready_n (hready_n),
\r
143 .mr_stat_1000base_x_fd (mr_stat_1000base_x_fd),
\r
144 .mr_stat_1000base_x_hd (mr_stat_1000base_x_hd),
\r
145 .mr_stat_1000base_t_fd (mr_stat_1000base_t_fd),
\r
146 .mr_stat_1000base_t_hd (mr_stat_1000base_t_hd),
\r
148 .mr_stat_100base_t4 (mr_stat_100base_t4),
\r
149 .mr_stat_100base_x_fd (mr_stat_100base_x_fd),
\r
150 .mr_stat_100base_x_hd (mr_stat_100base_x_hd),
\r
151 .mr_stat_10mbps_fd (mr_stat_10mbps_fd),
\r
152 .mr_stat_10mbps_hd (mr_stat_10mbps_hd),
\r
153 .mr_stat_100base_t2_fd (mr_stat_100base_t2_fd),
\r
154 .mr_stat_100base_t2_hd (mr_stat_100base_t2_hd),
\r
156 .mr_stat_extended_stat (mr_stat_extended_stat),
\r
157 .mr_stat_unidir_able (mr_stat_unidir_able),
\r
158 .mr_stat_preamb_supr (mr_stat_preamb_supr),
\r
159 .mr_stat_an_complete (mr_stat_an_complete),
\r
160 .mr_stat_remote_fault (mr_stat_remote_fault),
\r
161 .mr_stat_an_able (mr_stat_an_able),
\r
162 .mr_stat_link_stat (mr_stat_link_stat),
\r
163 .mr_stat_jab_det (mr_stat_jab_det),
\r
164 .mr_stat_extended_cap (mr_stat_extended_cap),
\r
166 .mr_page_rx (mr_page_rx),
\r
167 .mr_lp_adv_ability (mr_lp_adv_ability),
\r
169 .mr_main_reset (mr_main_reset),
\r
170 .mr_loopback_enable (mr_loopback_enable),
\r
171 .mr_speed_selection (mr_speed_selection),
\r
172 .mr_an_enable (mr_an_enable),
\r
173 .mr_power_down (mr_power_down),
\r
174 .mr_isolate (mr_isolate),
\r
175 .mr_restart_an (mr_restart_an),
\r
176 .mr_duplex_mode (mr_duplex_mode),
\r
177 .mr_col_test (mr_col_test),
\r
178 .mr_unidir_enable (mr_unidir_enable),
\r
180 .mr_adv_ability (mr_adv_ability)
\r
189 module register_0_hb (
\r
201 mr_loopback_enable,
\r
202 mr_speed_selection,
\r
219 input [15:0] data_in;
\r
221 output [15:0] data_out;
\r
222 output mr_main_reset; // bit D15 // R/W // Self Clearing
\r
223 output mr_loopback_enable; // bit D14 // R/W
\r
224 output [1:0] mr_speed_selection; // bit D13 LSB bit D6 MSB // R/W
\r
225 output mr_an_enable; // bit D12 // R/W
\r
226 output mr_power_down; // bit D11 // R/W
\r
227 output mr_isolate; // bit D10 // R/W
\r
228 output mr_restart_an; // bit D09 // R/W // Self Clearing
\r
229 output mr_duplex_mode; // bit D08 // STUCK HIGH
\r
230 output mr_col_test; // bit D08 // STUCK LOW
\r
231 output mr_unidir_enable; // bit D05 // STUCK LOW
\r
233 reg [15:0] data_out;
\r
235 reg mr_loopback_enable;
\r
236 reg [1:0] mr_speed_selection;
\r
238 reg mr_power_down = 1'b0;
\r
241 reg mr_duplex_mode;
\r
243 reg mr_unidir_enable;
\r
252 always @(posedge clk or negedge rst_n) begin
\r
253 if (rst_n == 1'b0) begin
\r
258 gbe_mode_d1 <= gbe_mode;
\r
259 gbe_mode_d2 <= gbe_mode_d1;
\r
265 // Write Operations
\r
267 // Low Portion of Register[D7:D0] has no
\r
268 // implemented bits. Therefore, no write
\r
269 // operations here.
\r
271 // High Portion of Register[D15:D8]
\r
272 always @(posedge clk or negedge rst_n) begin
\r
273 if (rst_n == 1'b0) begin
\r
274 mr_main_reset <= 1'b0;
\r
275 mr_loopback_enable <= 1'b0;
\r
276 mr_speed_selection <= 2'b10;
\r
277 mr_an_enable <= 1'b1;
\r
278 mr_power_down <= 1'b0;
\r
279 mr_isolate <= 1'b0;
\r
280 mr_restart_an <= 1'b0;
\r
281 mr_duplex_mode <= 1'b1;
\r
282 mr_col_test <= 1'b0;
\r
283 mr_unidir_enable <= 1'b0;
\r
290 mr_duplex_mode <= 1'b1; // STUCK HIGH
\r
291 mr_col_test <= 1'b0; // STUCK LOW
\r
294 if (cs_1 && ready && write) begin
\r
295 mr_main_reset <= data_in[15];
\r
296 mr_loopback_enable <= data_in[14];
\r
297 mr_an_enable <= data_in[12];
\r
298 mr_power_down <= data_in[11];
\r
299 mr_isolate <= data_in[10];
\r
300 mr_restart_an <= data_in[9];
\r
304 // Manage Writes to Speed Selection Based on GBE MODE
\r
305 if (gbe_mode_d2) begin
\r
306 mr_speed_selection[1:0] <= 2'b10; // STUCK AT 1GBPS
\r
309 if (cs_1 && ready && write) begin
\r
310 mr_speed_selection[0] <= data_in[13];
\r
312 if (cs_0 && ready && write) begin
\r
313 mr_speed_selection[1] <= data_in[6];
\r
314 mr_unidir_enable <= data_in[5];
\r
320 // Delay the Self Clearing Register Bits
\r
321 m_m_r <= mr_main_reset;
\r
322 m_r_a <= mr_restart_an;
\r
324 // Do the Self Clearing
\r
326 mr_main_reset <= 0;
\r
329 mr_restart_an <= 0;
\r
339 data_out[7] <= mr_col_test;
\r
340 data_out[6] <= mr_speed_selection[1];
\r
341 data_out[5] <= mr_unidir_enable;
\r
342 data_out[4] <= 1'b0;
\r
343 data_out[3] <= 1'b0;
\r
344 data_out[2] <= 1'b0;
\r
345 data_out[1] <= 1'b0;
\r
346 data_out[0] <= 1'b0;
\r
348 data_out[15] <= mr_main_reset;
\r
349 data_out[14] <= mr_loopback_enable;
\r
350 data_out[13] <= mr_speed_selection[0];
\r
351 data_out[12] <= mr_an_enable;
\r
352 data_out[11] <= mr_power_down;
\r
353 data_out[10] <= mr_isolate;
\r
354 data_out[9] <= mr_restart_an;
\r
355 data_out[8] <= mr_duplex_mode;
\r
359 module register_1_hb (
\r
368 mr_stat_100base_t4,
\r
369 mr_stat_100base_x_fd,
\r
370 mr_stat_100base_x_hd,
\r
373 mr_stat_100base_t2_fd,
\r
374 mr_stat_100base_t2_hd,
\r
376 mr_stat_extended_stat,
\r
377 mr_stat_unidir_able,
\r
378 mr_stat_preamb_supr,
\r
379 mr_stat_an_complete,
\r
380 mr_stat_remote_fault,
\r
384 mr_stat_extended_cap,
\r
395 input mr_stat_100base_t4; // bit D15 // Read-Only
\r
396 input mr_stat_100base_x_fd; // bit D14 // Read-Only
\r
397 input mr_stat_100base_x_hd; // bit D13 // Read-Only
\r
398 input mr_stat_10mbps_fd; // bit D12 // Read-Only
\r
399 input mr_stat_10mbps_hd; // bit D11 // Read-Only
\r
400 input mr_stat_100base_t2_fd; // bit D10 // Read-Only
\r
401 input mr_stat_100base_t2_hd; // bit D9 // Read-Only
\r
403 input mr_stat_extended_stat; // bit D8 // Read-Only
\r
404 input mr_stat_unidir_able; // bit D7 // Read-Only
\r
405 input mr_stat_preamb_supr; // bit D6 // Read-Only
\r
406 input mr_stat_an_complete; // bit D5 // Read-Only
\r
407 input mr_stat_remote_fault; // bit D4 // Read-Only
\r
408 input mr_stat_an_able; // bit D3 // Read-Only
\r
409 input mr_stat_link_stat; // bit D2 // Read-Only // Latch-On-Zero // Clear-On-Read
\r
410 input mr_stat_jab_det; // bit D1 // Read-Only
\r
411 input mr_stat_extended_cap; // bit D0 // Read-Only
\r
413 output [15:0] data_out;
\r
415 reg [15:0] data_out;
\r
423 reg allow_link_stat;
\r
424 reg link_ok_status;
\r
425 // metastability filter
\r
426 always @(posedge clk or negedge rst_n) begin
\r
427 if (rst_n == 1'b0) begin
\r
428 link_stat_d1 <= 1'b0;
\r
429 link_stat_d2 <= 1'b0;
\r
432 link_stat_d1 <= mr_stat_link_stat;
\r
433 link_stat_d2 <= link_stat_d1;
\r
437 // generate clear-on-read signal
\r
438 always @(posedge clk or negedge rst_n) begin
\r
439 if (rst_n == 1'b0) begin
\r
440 clear_on_read <= 1'b0;
\r
441 read_detect <= 1'b0;
\r
446 if (!write && ready && cs_0)
\r
447 read_detect <= 1'b1;
\r
449 read_detect <= 1'b0;
\r
451 rd_d1 <= read_detect;
\r
454 // assert on falling edge of rd_d2
\r
455 clear_on_read <= !rd_d1 & rd_d2;
\r
461 always @(posedge clk or negedge rst_n) begin
\r
462 if (rst_n == 1'b0) begin
\r
463 allow_link_stat <= 1'b0;
\r
464 link_ok_status <= 1'b0;
\r
468 case (allow_link_stat)
\r
470 if (clear_on_read) begin
\r
471 allow_link_stat<= 1'b1;
\r
476 if (!link_stat_d2) begin
\r
477 allow_link_stat <= 1'b0;
\r
483 if (allow_link_stat) begin
\r
484 // allow status shoot-thru after clear-on-read
\r
485 link_ok_status <= link_stat_d2;
\r
488 // force status low when link IS NOT_OKAY
\r
489 link_ok_status <= 1'b0;
\r
499 data_out[7] <= mr_stat_unidir_able;
\r
500 data_out[6] <= mr_stat_preamb_supr;
\r
501 data_out[5] <= mr_stat_an_complete;
\r
502 data_out[4] <= mr_stat_remote_fault;
\r
503 data_out[3] <= mr_stat_an_able;
\r
504 data_out[2] <= link_ok_status;
\r
505 data_out[1] <= mr_stat_jab_det;
\r
506 data_out[0] <= mr_stat_extended_cap;
\r
508 data_out[15] <= mr_stat_100base_t4;
\r
509 data_out[14] <= mr_stat_100base_x_fd;
\r
510 data_out[13] <= mr_stat_100base_x_hd;
\r
511 data_out[12] <= mr_stat_10mbps_fd;
\r
512 data_out[11] <= mr_stat_10mbps_hd;
\r
513 data_out[10] <= mr_stat_100base_t2_fd;
\r
514 data_out[9] <= mr_stat_100base_t2_hd;
\r
515 data_out[8] <= mr_stat_extended_stat;
\r
519 module register_4_hb (
\r
534 parameter [15:0] initval_gbe = 16'h0020;
\r
535 parameter [15:0] initval_phy = 16'hd801;
\r
536 parameter [15:0] initval_mac = 16'h4001;
\r
546 input [15:0] data_in;
\r
548 output [15:0] data_out;
\r
549 output [15:0] mr_adv_ability; // When sgmii_mode == 1 == PHY
\r
550 // all bits D15-D0 are R/W,
\r
551 ///////////////////////////////////
\r
552 // D15 = Link Status (1=up, 0=down)
\r
553 // D14 = Can be written but has no effect
\r
554 // on autonegotiation. Instead
\r
555 // the autonegotiation state machine
\r
556 // controls the utilization of this bit.
\r
557 // D12 = Duplex Mode (1=full, 0=half)
\r
558 // D11:10 = Speed (11=reserved)
\r
563 // all other bits = 0
\r
564 ///////////////////////////////////
\r
565 //When sgmii_mode == 0 = MAC
\r
566 // all bits D15-D0 are R/W,
\r
567 // D14 = Can be written but has no effect
\r
568 // on autonegotiation. Instead
\r
569 // the autonegotiation state machine
\r
570 // controls the utilization of this bit.
\r
572 // all other bits = 0
\r
573 ///////////////////////////////////
\r
576 reg [15:0] data_out;
\r
577 reg [15:0] mr_adv_ability;
\r
591 reg sgmii_mode_change;
\r
596 reg gbe_mode_change;
\r
598 // generate a synchronous reset signal
\r
599 // note: this method is used so that
\r
600 // an initval can be applied during
\r
601 // device run-time, instead of at compile time
\r
602 always @(posedge clk or negedge rst_n) begin
\r
603 if (rst_n == 1'b0) begin
\r
624 // asserts on rising edge of rst_d8
\r
625 sync_reset <= !rst_d8 & rst_d7;
\r
630 // Detect change in sgmii_mode
\r
631 always @(posedge clk or negedge rst_n) begin
\r
632 if (rst_n == 1'b0) begin
\r
633 sgmii_mode_d1 <= 0;
\r
634 sgmii_mode_d2 <= 0;
\r
635 sgmii_mode_d3 <= 0;
\r
636 sgmii_mode_d4 <= 0;
\r
637 sgmii_mode_change <= 0;
\r
642 sgmii_mode_d1 <= sgmii_mode;
\r
643 sgmii_mode_d2 <= sgmii_mode_d1;
\r
646 sgmii_mode_d3 <= sgmii_mode_d2;
\r
647 sgmii_mode_d4 <= sgmii_mode_d3;
\r
650 if (sgmii_mode_d3 != sgmii_mode_d4)
\r
651 sgmii_mode_change <= 1;
\r
653 sgmii_mode_change <= 0;
\r
658 // Detect change in gbe_mode
\r
659 always @(posedge clk or negedge rst_n) begin
\r
660 if (rst_n == 1'b0) begin
\r
665 gbe_mode_change <= 0;
\r
670 gbe_mode_d1 <= gbe_mode;
\r
671 gbe_mode_d2 <= gbe_mode_d1;
\r
674 gbe_mode_d3 <= gbe_mode_d2;
\r
675 gbe_mode_d4 <= gbe_mode_d3;
\r
678 if (gbe_mode_d3 != gbe_mode_d4)
\r
679 gbe_mode_change <= 1;
\r
681 gbe_mode_change <= 0;
\r
686 // Write Operations
\r
687 // Low Portion of Register[D7:D0]
\r
688 always @(posedge clk or negedge rst_n) begin
\r
689 if (rst_n == 1'b0) begin
\r
690 mr_adv_ability[7:0] <= 8'h01;
\r
692 else if (sync_reset || sgmii_mode_change || gbe_mode_change) begin
\r
694 mr_adv_ability[7:0] <= initval_gbe[7:0];
\r
695 else if (sgmii_mode)
\r
696 mr_adv_ability[7:0] <= initval_phy[7:0];
\r
698 mr_adv_ability[7:0] <= initval_mac[7:0];
\r
701 if (cs_0 && ready && write && (sgmii_mode || gbe_mode)) begin
\r
702 mr_adv_ability[7:0] <= data_in[7:0];
\r
708 // High Portion of Register[D15:D8]
\r
709 always @(posedge clk or negedge rst_n) begin
\r
710 if (rst_n == 1'b0) begin
\r
711 mr_adv_ability[15:8] <= 8'h40; // default
\r
713 else if (sync_reset || sgmii_mode_change || gbe_mode_change) begin
\r
715 mr_adv_ability[15:8] <= initval_gbe[15:8];
\r
716 else if (sgmii_mode)
\r
717 mr_adv_ability[15:8] <= initval_phy[15:8];
\r
719 mr_adv_ability[15:8] <= initval_mac[15:8];
\r
722 if (cs_1 && ready && write && (sgmii_mode || gbe_mode)) begin
\r
723 mr_adv_ability[15:8] <= data_in[15:8];
\r
739 data_out[7:0] <= mr_adv_ability[7:0];
\r
740 data_out[15:8] <= mr_adv_ability[15:8];
\r
750 module register_5_hb (
\r
764 input [15:0] mr_lp_adv_ability;
\r
765 // This entire register is read-only
\r
766 ///////////////////////////////////
\r
767 // When sgmii_mode == 0 == MAC
\r
768 ///////////////////////////////////
\r
769 // D15 = PHY Link Status (1=up, 0=down)
\r
770 // D14 = PHY Autonegotiation Handshake
\r
771 // D12 = PHY Duplex Mode (1=full, 0=half)
\r
772 // D11:10 = PHY Speed (11=reserved)
\r
777 // all other bits = 0
\r
778 ///////////////////////////////////
\r
779 //When sgmii_mode == 1 = PHY
\r
780 // D14 = MAC Autonegotiation Handshake
\r
782 // all other bits = 0
\r
783 ///////////////////////////////////
\r
784 output [15:0] data_out;
\r
786 reg [15:0] data_out;
\r
791 data_out[7:0] <= mr_lp_adv_ability[7:0];
\r
792 data_out[15:8] <= mr_lp_adv_ability[15:8];
\r
796 module register_6_hb (
\r
815 output [15:0] data_out;
\r
817 reg [15:0] data_out;
\r
818 reg mr_page_rx_latched;
\r
824 // generate clear-on-read signal
\r
825 always @(posedge clk or negedge rst_n) begin
\r
826 if (rst_n == 1'b0) begin
\r
827 clear_on_read <= 0;
\r
833 if (!write && ready && cs_0)
\r
838 rd_d1 <= read_detect;
\r
841 // assert on falling edge of rd_d2
\r
842 clear_on_read <= !rd_d1 & rd_d2;
\r
848 always @(posedge clk or negedge rst_n) begin
\r
849 if (rst_n == 1'b0) begin
\r
850 mr_page_rx_latched <= 0;
\r
854 mr_page_rx_latched <= 0;
\r
855 else if (mr_page_rx)
\r
856 mr_page_rx_latched <= 1;
\r
864 data_out[15:2] <= 14'd0;
\r
865 data_out[1] <= mr_page_rx_latched;
\r
871 module register_f_hb (
\r
876 mr_stat_1000base_x_fd,
\r
877 mr_stat_1000base_x_hd,
\r
878 mr_stat_1000base_t_fd,
\r
879 mr_stat_1000base_t_hd,
\r
888 input mr_stat_1000base_x_fd; // bit D15 // Read-Only
\r
889 input mr_stat_1000base_x_hd; // bit D14 // Read-Only
\r
890 input mr_stat_1000base_t_fd; // bit D13 // Read-Only
\r
891 input mr_stat_1000base_t_hd; // bit D12 // Read-Only
\r
893 output [15:0] data_out;
\r
895 reg [15:0] data_out;
\r
901 data_out[7] <= 1'b0;
\r
902 data_out[6] <= 1'b0;
\r
903 data_out[5] <= 1'b0;
\r
904 data_out[4] <= 1'b0;
\r
905 data_out[3] <= 1'b0;
\r
906 data_out[2] <= 1'b0;
\r
907 data_out[1] <= 1'b0;
\r
908 data_out[0] <= 1'b0;
\r
910 data_out[15] <= mr_stat_1000base_x_fd;
\r
911 data_out[14] <= mr_stat_1000base_x_hd;
\r
912 data_out[13] <= mr_stat_1000base_t_fd;
\r
913 data_out[12] <= mr_stat_1000base_t_hd;
\r
914 data_out[11] <= 1'b0;
\r
915 data_out[10] <= 1'b0;
\r
916 data_out[9] <= 1'b0;
\r
917 data_out[8] <= 1'b0;
\r
935 mr_stat_1000base_x_fd,
\r
936 mr_stat_1000base_x_hd,
\r
937 mr_stat_1000base_t_fd,
\r
938 mr_stat_1000base_t_hd,
\r
940 mr_stat_100base_t4,
\r
941 mr_stat_100base_x_fd,
\r
942 mr_stat_100base_x_hd,
\r
945 mr_stat_100base_t2_fd,
\r
946 mr_stat_100base_t2_hd,
\r
948 mr_stat_extended_stat,
\r
949 mr_stat_unidir_able,
\r
950 mr_stat_preamb_supr,
\r
951 mr_stat_an_complete,
\r
952 mr_stat_remote_fault,
\r
956 mr_stat_extended_cap,
\r
962 mr_loopback_enable,
\r
963 mr_speed_selection,
\r
981 input [7:0] hdatain;
\r
983 output [7:0] hdataout;
\r
986 input mr_stat_1000base_x_fd;
\r
987 input mr_stat_1000base_x_hd;
\r
988 input mr_stat_1000base_t_fd;
\r
989 input mr_stat_1000base_t_hd;
\r
991 input mr_stat_100base_t4;
\r
992 input mr_stat_100base_x_fd;
\r
993 input mr_stat_100base_x_hd;
\r
994 input mr_stat_10mbps_fd;
\r
995 input mr_stat_10mbps_hd;
\r
996 input mr_stat_100base_t2_fd;
\r
997 input mr_stat_100base_t2_hd;
\r
999 input mr_stat_extended_stat;
\r
1000 input mr_stat_unidir_able;
\r
1001 input mr_stat_preamb_supr;
\r
1002 input mr_stat_an_complete;
\r
1003 input mr_stat_remote_fault;
\r
1004 input mr_stat_an_able;
\r
1005 input mr_stat_link_stat;
\r
1006 input mr_stat_jab_det;
\r
1007 input mr_stat_extended_cap;
\r
1010 input [15:0] mr_lp_adv_ability;
\r
1012 output mr_main_reset;
\r
1013 output mr_loopback_enable;
\r
1014 output [1:0] mr_speed_selection;
\r
1015 output mr_an_enable;
\r
1016 output mr_power_down;
\r
1017 output mr_isolate;
\r
1018 output mr_restart_an;
\r
1019 output mr_duplex_mode;
\r
1020 output mr_col_test;
\r
1021 output mr_unidir_enable;
\r
1022 output [15:0] mr_adv_ability;
\r
1024 ///////////////////////////////////
\r
1028 reg [7:0] hdataout;
\r
1032 reg hcs_n_delayed;
\r
1052 wire [15:0] data_out_reg_0;
\r
1053 wire [15:0] data_out_reg_1;
\r
1054 wire [15:0] data_out_reg_4;
\r
1055 wire [15:0] data_out_reg_5;
\r
1056 wire [15:0] data_out_reg_6;
\r
1057 wire [15:0] data_out_reg_f;
\r
1061 register_addr_decoder ad_dec (
\r
1066 .reg0_cs_0 (reg0_cs_0),
\r
1067 .reg0_cs_1 (reg0_cs_1),
\r
1068 .reg1_cs_0 (reg1_cs_0),
\r
1069 .reg1_cs_1 (reg1_cs_1),
\r
1070 .reg4_cs_0 (reg4_cs_0),
\r
1071 .reg4_cs_1 (reg4_cs_1),
\r
1072 .reg5_cs_0 (reg5_cs_0),
\r
1073 .reg5_cs_1 (reg5_cs_1),
\r
1074 .reg6_cs_0 (reg6_cs_0),
\r
1075 .reg6_cs_1 (reg6_cs_1),
\r
1076 .regf_cs_0 (regf_cs_0),
\r
1077 .regf_cs_1 (regf_cs_1)
\r
1081 register_0_hb register_0 (
\r
1084 .gbe_mode (gbe_mode),
\r
1085 .cs_0 (reg0_cs_0),
\r
1086 .cs_1 (reg0_cs_1),
\r
1087 .write (~hwrite_n),
\r
1089 .data_in ({hdatain, hdatain}),
\r
1091 .data_out (data_out_reg_0),
\r
1092 .mr_main_reset (mr_main_reset),
\r
1093 .mr_loopback_enable (mr_loopback_enable),
\r
1094 .mr_speed_selection (mr_speed_selection),
\r
1095 .mr_an_enable (mr_an_enable),
\r
1096 .mr_power_down (mr_power_down),
\r
1097 .mr_isolate (mr_isolate),
\r
1098 .mr_restart_an (mr_restart_an),
\r
1099 .mr_duplex_mode (mr_duplex_mode),
\r
1100 .mr_col_test (mr_col_test),
\r
1101 .mr_unidir_enable (mr_unidir_enable)
\r
1105 register_1_hb register_1 (
\r
1108 .cs_0 (reg1_cs_0),
\r
1109 .cs_1 (reg1_cs_1),
\r
1110 .write (~hwrite_n),
\r
1113 .mr_stat_100base_t4 (mr_stat_100base_t4),
\r
1114 .mr_stat_100base_x_fd (mr_stat_100base_x_fd),
\r
1115 .mr_stat_100base_x_hd (mr_stat_100base_x_hd),
\r
1116 .mr_stat_10mbps_fd (mr_stat_10mbps_fd),
\r
1117 .mr_stat_10mbps_hd (mr_stat_10mbps_hd),
\r
1118 .mr_stat_100base_t2_fd (mr_stat_100base_t2_fd),
\r
1119 .mr_stat_100base_t2_hd (mr_stat_100base_t2_hd),
\r
1121 .mr_stat_extended_stat (mr_stat_extended_stat),
\r
1122 .mr_stat_unidir_able (mr_stat_unidir_able),
\r
1123 .mr_stat_preamb_supr (mr_stat_preamb_supr),
\r
1124 .mr_stat_an_complete (mr_stat_an_complete),
\r
1125 .mr_stat_remote_fault (mr_stat_remote_fault),
\r
1126 .mr_stat_an_able (mr_stat_an_able),
\r
1127 .mr_stat_link_stat (mr_stat_link_stat),
\r
1128 .mr_stat_jab_det (mr_stat_jab_det),
\r
1129 .mr_stat_extended_cap (mr_stat_extended_cap),
\r
1131 .data_out (data_out_reg_1)
\r
1135 register_4_hb register_4 (
\r
1138 .gbe_mode (gbe_mode),
\r
1139 .sgmii_mode (sgmii_mode),
\r
1140 .cs_0 (reg4_cs_0),
\r
1141 .cs_1 (reg4_cs_1),
\r
1142 .write (~hwrite_n),
\r
1144 .data_in ({hdatain, hdatain}),
\r
1146 .data_out (data_out_reg_4),
\r
1147 .mr_adv_ability (mr_adv_ability)
\r
1151 register_5_hb register_5 (
\r
1153 .mr_lp_adv_ability (mr_lp_adv_ability),
\r
1154 .cs_0 (reg5_cs_0),
\r
1155 .cs_1 (reg5_cs_1),
\r
1158 .data_out (data_out_reg_5)
\r
1162 register_6_hb register_6 (
\r
1165 .mr_page_rx (mr_page_rx),
\r
1166 .cs_0 (reg6_cs_0),
\r
1167 .cs_1 (reg6_cs_1),
\r
1168 .write (~hwrite_n),
\r
1171 .data_out (data_out_reg_6)
\r
1176 register_f_hb register_f (
\r
1178 .cs_0 (regf_cs_0),
\r
1179 .cs_1 (regf_cs_1),
\r
1181 .mr_stat_1000base_x_fd (mr_stat_1000base_x_fd),
\r
1182 .mr_stat_1000base_x_hd (mr_stat_1000base_x_hd),
\r
1183 .mr_stat_1000base_t_fd (mr_stat_1000base_t_fd),
\r
1184 .mr_stat_1000base_t_hd (mr_stat_1000base_t_hd),
\r
1186 .data_out (data_out_reg_f)
\r
1190 // generate an ack
\r
1191 always @(posedge hclk or negedge rst_n) begin
\r
1192 if (rst_n == 1'b0) begin
\r
1193 hcs_n_delayed <= 1'b1;
\r
1198 hcs_n_delayed <= hcs_n;
\r
1200 //assert on falling edge of delayed chip select
\r
1201 hr <= ~hcs_n & hcs_n_delayed;
\r
1208 // Mux Register Read-Data Outputs
\r
1209 always @(posedge hclk or negedge rst_n)
\r
1211 if (rst_n == 1'b0) begin
\r
1219 hdataout <= data_out_reg_0[7:0];
\r
1225 hdataout <= data_out_reg_0[15:8];
\r
1228 /////////////////////////////////////////////
\r
1232 hdataout <= data_out_reg_1[7:0];
\r
1238 hdataout <= data_out_reg_1[15:8];
\r
1241 /////////////////////////////////////////////
\r
1245 hdataout <= data_out_reg_4[7:0];
\r
1251 hdataout <= data_out_reg_4[15:8];
\r
1254 /////////////////////////////////////////////
\r
1258 hdataout <= data_out_reg_5[7:0];
\r
1264 hdataout <= data_out_reg_5[15:8];
\r
1267 /////////////////////////////////////////////
\r
1271 hdataout <= data_out_reg_6[7:0];
\r
1277 hdataout <= data_out_reg_6[15:8];
\r
1280 /////////////////////////////////////////////
\r
1284 hdataout <= data_out_reg_f[7:0];
\r
1290 hdataout <= data_out_reg_f[15:8];
\r
1293 /////////////////////////////////////////////
\r
1305 module register_addr_decoder (
\r
1351 //////////////////////////
\r
1371 //////////////////////////
\r
1373 assign reg0_cs_0 = (addr == 6'h00) ? cs_in : 1'b0;
\r
1374 assign reg0_cs_1 = (addr == 6'h01) ? cs_in : 1'b0;
\r
1376 assign reg1_cs_0 = (addr == 6'h02) ? cs_in : 1'b0;
\r
1377 assign reg1_cs_1 = (addr == 6'h03) ? cs_in : 1'b0;
\r
1379 assign reg4_cs_0 = (addr == 6'h08) ? cs_in : 1'b0;
\r
1380 assign reg4_cs_1 = (addr == 6'h09) ? cs_in : 1'b0;
\r
1382 assign reg5_cs_0 = (addr == 6'h0a) ? cs_in : 1'b0;
\r
1383 assign reg5_cs_1 = (addr == 6'h0b) ? cs_in : 1'b0;
\r
1385 assign reg6_cs_0 = (addr == 6'h0c) ? cs_in : 1'b0;
\r
1386 assign reg6_cs_1 = (addr == 6'h0d) ? cs_in : 1'b0;
\r
1388 assign regf_cs_0 = (addr == 6'h1e) ? cs_in : 1'b0;
\r
1389 assign regf_cs_1 = (addr == 6'h1f) ? cs_in : 1'b0;
\r