[6] | 1 | // ========== Copyright Header Begin ========================================== |
---|
| 2 | // |
---|
| 3 | // OpenSPARC T1 Processor File: bw_r_efa.v |
---|
| 4 | // Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. |
---|
| 5 | // DO NOT ALTER OR REMOVE COPYRIGHT NOTICES. |
---|
| 6 | // |
---|
| 7 | // The above named program is free software; you can redistribute it and/or |
---|
| 8 | // modify it under the terms of the GNU General Public |
---|
| 9 | // License version 2 as published by the Free Software Foundation. |
---|
| 10 | // |
---|
| 11 | // The above named program is distributed in the hope that it will be |
---|
| 12 | // useful, but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 13 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
| 14 | // General Public License for more details. |
---|
| 15 | // |
---|
| 16 | // You should have received a copy of the GNU General Public |
---|
| 17 | // License along with this work; if not, write to the Free Software |
---|
| 18 | // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. |
---|
| 19 | // |
---|
| 20 | // ========== Copyright Header End ============================================ |
---|
| 21 | //**************************************************************** |
---|
| 22 | // |
---|
| 23 | // Module: bw_r_efa |
---|
| 24 | // |
---|
| 25 | // Description: RTL model for EFA (EFuse Array) |
---|
| 26 | // |
---|
| 27 | //**************************************************************** |
---|
| 28 | `include "sys.h" |
---|
| 29 | |
---|
| 30 | module bw_r_efa ( |
---|
| 31 | vpp, |
---|
| 32 | pi_efa_prog_en, |
---|
| 33 | sbc_efa_read_en, |
---|
| 34 | sbc_efa_word_addr, |
---|
| 35 | sbc_efa_bit_addr, |
---|
| 36 | sbc_efa_margin0_rd, |
---|
| 37 | sbc_efa_margin1_rd, |
---|
| 38 | efa_sbc_data, |
---|
| 39 | pwr_ok, |
---|
| 40 | por_n, |
---|
| 41 | sbc_efa_sup_det_rd, |
---|
| 42 | sbc_efa_power_down, |
---|
| 43 | so, |
---|
| 44 | si, |
---|
| 45 | se, |
---|
| 46 | vddo, |
---|
| 47 | clk |
---|
| 48 | ); |
---|
| 49 | |
---|
| 50 | |
---|
| 51 | input vpp; // VPP input from I/O |
---|
| 52 | |
---|
| 53 | output [31:0] efa_sbc_data; // Data from e-fuse array to SBC |
---|
| 54 | input pi_efa_prog_en; // e-fuse array program enable |
---|
| 55 | input sbc_efa_read_en; // e-fuse array read enable |
---|
| 56 | input [5:0] sbc_efa_word_addr; // e-fuse array word addr |
---|
| 57 | input [4:0] sbc_efa_bit_addr; // e-fuse array bit addr |
---|
| 58 | input sbc_efa_margin0_rd; // e-fuse array margin0 read |
---|
| 59 | input sbc_efa_margin1_rd; // e-fuse array margin1 read |
---|
| 60 | |
---|
| 61 | input pwr_ok; // power_ok reset |
---|
| 62 | input por_n; // por_n reset |
---|
| 63 | input sbc_efa_sup_det_rd; // e-fuse array supply detect read |
---|
| 64 | input sbc_efa_power_down; // e-fuse power down signal from SBC |
---|
| 65 | |
---|
| 66 | output so; // Scan ports |
---|
| 67 | input si; |
---|
| 68 | input se; |
---|
| 69 | input vddo; |
---|
| 70 | input clk; // cpu clk |
---|
| 71 | |
---|
| 72 | /*--------------------------------------------------------------------------*/ |
---|
| 73 | |
---|
| 74 | //** Parameters and define **// |
---|
| 75 | parameter MAXFILENAME=200; |
---|
| 76 | //parameter EFA_READ_LAT = 5670 ; // 7 system cycles (150Mhz) - 1/4(sys clk); about 45ns |
---|
| 77 | // 840 ticks = 1 system cycle |
---|
| 78 | parameter EFA_READ_LAT = 45000 ; // about 45ns (timescale is 1 ps) |
---|
| 79 | /* The access time has been specified to be 45ns for a worst case read */ |
---|
| 80 | |
---|
| 81 | //** Wire and Reg declarations **// |
---|
| 82 | |
---|
| 83 | reg [MAXFILENAME*8-1:0] efuse_data_filename; |
---|
| 84 | reg [31:0] efuse_array[0:63],efuse_row,efa_read_data; //EFUSE ARRAY |
---|
| 85 | integer file_get_status,i; |
---|
| 86 | reg [31:0] fpInVec; |
---|
| 87 | wire [31:0] efa_sbc_data; |
---|
| 88 | wire l1clk; |
---|
| 89 | wire lvl_det_l; // level detect ok |
---|
| 90 | wire vddc_ok_l; // vddc ok |
---|
| 91 | wire vddo_ok_l; // vddo ok |
---|
| 92 | wire vpp_ok_l; // vpp ok |
---|
| 93 | reg efuse_rd_progress; |
---|
| 94 | reg efuse_enable_write_check; |
---|
| 95 | |
---|
| 96 | /*--------------------------------------------------------------------------*/ |
---|
| 97 | |
---|
| 98 | // Process data file |
---|
| 99 | |
---|
| 100 | // synopsys translate_off |
---|
| 101 | initial |
---|
| 102 | begin |
---|
| 103 | efuse_enable_write_check = 1; |
---|
| 104 | // Get Efuse data file from plusarg. |
---|
| 105 | if ($value$plusargs("efuse_data_file=%s", efuse_data_filename)) |
---|
| 106 | begin |
---|
| 107 | // Read Efuse data file if present |
---|
| 108 | $display("INFO: efuse data file is being read--filename=%0s", |
---|
| 109 | efuse_data_filename); |
---|
| 110 | $readmemh(efuse_data_filename, efuse_array); |
---|
| 111 | $display("INFO: completed reading efuse data file"); |
---|
| 112 | end |
---|
| 113 | else |
---|
| 114 | begin |
---|
| 115 | //if file not present, initialize efuse_array with default value |
---|
| 116 | $display("INFO: Using default efuse data for the efuse array"); |
---|
| 117 | for (i=0;i<=63;i=i+1) begin |
---|
| 118 | efuse_array[i] = 32'b0; |
---|
| 119 | end |
---|
| 120 | end |
---|
| 121 | end |
---|
| 122 | |
---|
| 123 | // Process power down signal |
---|
| 124 | assign l1clk = clk & ~sbc_efa_power_down; |
---|
| 125 | |
---|
| 126 | // Scan logic not in RTL |
---|
| 127 | assign so = se ? si : 1'bx; |
---|
| 128 | |
---|
| 129 | //assign supply detect signals to valid values (circuit cannot be impl in model) |
---|
| 130 | assign vddc_ok_l = 1'b0; |
---|
| 131 | assign vddo_ok_l = 1'b0; |
---|
| 132 | assign vpp_ok_l = 1'b0; |
---|
| 133 | assign lvl_det_l = 1'b0; |
---|
| 134 | |
---|
| 135 | |
---|
| 136 | always @(posedge l1clk) begin |
---|
| 137 | // Write operation , one bit at a time |
---|
| 138 | if ((pi_efa_prog_en === 1'b1) && (pwr_ok === 1'b1) && (por_n === 1'b1)) begin |
---|
| 139 | efuse_row = efuse_array[sbc_efa_word_addr]; |
---|
| 140 | efuse_row[sbc_efa_bit_addr] = 1'b1; |
---|
| 141 | efuse_array[sbc_efa_word_addr] <= efuse_row; |
---|
| 142 | end |
---|
| 143 | end |
---|
| 144 | |
---|
| 145 | |
---|
| 146 | // efa_read_data is from the VPP_CORE which is reset to 0 in ckt when read is de-asserted |
---|
| 147 | // However in RTL it is reset to X because I want to simulate the wait time where |
---|
| 148 | // efa_read_data is indeed X till the latency period |
---|
| 149 | // margin reads are not modelled in the RTL |
---|
| 150 | always @(posedge l1clk) begin |
---|
| 151 | // Read operation , 32 bits at a time |
---|
| 152 | if ((sbc_efa_read_en) & ~efuse_rd_progress) begin |
---|
| 153 | // About 45ns |
---|
| 154 | efa_read_data[31:0] <= #EFA_READ_LAT efuse_array[sbc_efa_word_addr]; |
---|
| 155 | efuse_rd_progress = 1'b1; |
---|
| 156 | end |
---|
| 157 | if (~(sbc_efa_read_en)) begin |
---|
| 158 | efuse_rd_progress = 1'b0; |
---|
| 159 | end |
---|
| 160 | if (~efuse_rd_progress) begin |
---|
| 161 | efa_read_data[31:0] <= 32'bx; |
---|
| 162 | end |
---|
| 163 | end |
---|
| 164 | // synopsys translate_on |
---|
| 165 | |
---|
| 166 | // In ckt, when sbc_efa_read_en is low, output remains the same. |
---|
| 167 | |
---|
| 168 | assign efa_sbc_data[31:0] = por_n ? ((pwr_ok & sbc_efa_read_en) ? (sbc_efa_sup_det_rd ? |
---|
| 169 | {28'bx,~lvl_det_l,~vddc_ok_l,~vddo_ok_l,~vpp_ok_l} |
---|
| 170 | : efa_read_data[31:0] ) : efa_sbc_data[31:0]) : 32'b0; |
---|
| 171 | |
---|
| 172 | |
---|
| 173 | endmodule |
---|