OpenCores
URL https://opencores.org/ocsvn/sparc64soc/sparc64soc/trunk

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [T1-common/] [srams/] [bw_r_efa.v] - Blame information for rev 7

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
// ========== 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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.