issues 13,14: single clk, no more nclk
parent
24d56dc84b
commit
af556071b0
@ -1,427 +0,0 @@
|
||||
#!/usr/bin/python3
|
||||
#
|
||||
# Parse table comments and create equations.
|
||||
|
||||
from optparse import OptionParser
|
||||
import re
|
||||
from shutil import copyfile
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# Initialize
|
||||
|
||||
TYPE_INPUT = 0
|
||||
TYPE_OUTPUT = 1
|
||||
TYPE_SKIP = 99
|
||||
|
||||
lines = []
|
||||
tableMatches = []
|
||||
tableNames = []
|
||||
tableLines = []
|
||||
tables = {}
|
||||
|
||||
failOnError = True
|
||||
inFile = 'test.vhdl'
|
||||
outFileExt = 'vtable'
|
||||
overwrite = True
|
||||
backupExt = 'orig'
|
||||
backup = True
|
||||
noisy = False
|
||||
quiet = False
|
||||
verilog = False
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# Handle command line
|
||||
|
||||
usage = 'vtable [options] inFile'
|
||||
|
||||
parser = OptionParser(usage)
|
||||
parser.add_option('-f', '--outfile', dest='outFile', help='output file, default=[inFile]' + outFileExt)
|
||||
parser.add_option('-o', '--overwrite', dest='overwrite', help='overwrite inFile, default=' + str(overwrite))
|
||||
parser.add_option('-b', '--backup', dest='backup', help='backup original file, default=' + str(backup))
|
||||
parser.add_option('-q', '--quiet', dest='quiet', action='store_true', help='quiet messages, default=' + str(quiet))
|
||||
parser.add_option('-n', '--noisy', dest='noisy', action='store_true', help='noisy messages, default=' + str(noisy))
|
||||
parser.add_option('-V', '--verilog', dest='verilog', action='store_true', help='source is verilog, default=' + str(verilog))
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
if len(args) != 1:
|
||||
parser.error(usage)
|
||||
quit(-1)
|
||||
else:
|
||||
inFile = args[0]
|
||||
|
||||
if options.overwrite == '0':
|
||||
overwrite = False
|
||||
elif options.overwrite == '1':
|
||||
overwrite == True
|
||||
if options.outFile is not None:
|
||||
parser.error('Can\'t specify outfile and overrite!')
|
||||
quit(-1)
|
||||
elif options.overwrite is not None:
|
||||
parser.error('overwrite: 0|1')
|
||||
quit(-1)
|
||||
|
||||
if options.quiet is not None:
|
||||
quiet = True
|
||||
|
||||
if options.noisy is not None:
|
||||
noisy = True
|
||||
|
||||
if options.verilog is not None:
|
||||
verilog = True
|
||||
|
||||
if options.backup == '0':
|
||||
backup = False
|
||||
elif options.backup == '1':
|
||||
backup == True
|
||||
elif options.backup is not None:
|
||||
parser.error('backup: 0|1')
|
||||
quit(-1)
|
||||
|
||||
if options.outFile is not None:
|
||||
outFile = options.outFile
|
||||
elif overwrite:
|
||||
outFile = inFile
|
||||
else:
|
||||
outFile = inFile + '.' + outFileExt
|
||||
|
||||
backupFile = inFile + '.' + backupExt
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# Objects
|
||||
|
||||
class Signal:
|
||||
|
||||
def __init__(self, name, type):
|
||||
self.name = name;
|
||||
self.type = type;
|
||||
|
||||
class Table:
|
||||
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.source = []
|
||||
self.signals = {}
|
||||
self.signalsByCol = {}
|
||||
self.typesByCol = {}
|
||||
self.specs = [] # list of specsByCol
|
||||
self.equations = []
|
||||
self.added = False
|
||||
|
||||
def validate(self):
|
||||
# check that all signals have a good type
|
||||
for col in self.signalsByCol:
|
||||
if col not in self.typesByCol:
|
||||
error('Table ' + self.name + ': no signal type for ' + self.signalsByCol[col])
|
||||
elif self.typesByCol[col] == None:
|
||||
error('Table ' + self.name + ': bad signal type (' + str(self.typesByCol[col]) + ') for ' + str(self.signalsByCol[col]))
|
||||
|
||||
def makeRTL(self, form=None):
|
||||
outputsByCol = {}
|
||||
|
||||
|
||||
#for col,type in self.typesByCol.items():
|
||||
for col in sorted(self.typesByCol):
|
||||
type = self.typesByCol[col]
|
||||
if type == TYPE_OUTPUT:
|
||||
if col in self.signalsByCol:
|
||||
outputsByCol[col] = self.signalsByCol[col]
|
||||
else:
|
||||
print(self.signalsByCol)
|
||||
print(self.typesByCol)
|
||||
error('Table ' + self.name + ': output is specified in col ' + str(col) + ' but no signal exists')
|
||||
|
||||
#for sigCol,sig in outputsByCol.items():
|
||||
for sigCol in sorted(outputsByCol):
|
||||
sig = outputsByCol[sigCol]
|
||||
if not verilog:
|
||||
line = sig + ' <= '
|
||||
else:
|
||||
line = 'assign ' + sig + ' = '
|
||||
nonzero = False
|
||||
for specsByCol in self.specs:
|
||||
terms = []
|
||||
if sigCol not in specsByCol:
|
||||
#error('* Output ' + sig + ' has no specified value for column ' + str(col))
|
||||
1 # no error, can be dontcare
|
||||
elif specsByCol[sigCol] == '1':
|
||||
for col,val in specsByCol.items():
|
||||
if col not in self.typesByCol:
|
||||
if noisy:
|
||||
error('Table ' + self.name +': unexpected value in spec column ' + str(col) + ' (' + str(val) + ') - no associated signal', False) #wtf UNTIL CAN HANDLE COMMENTS AT END!!!!!!!!!!!!!!!!!!!
|
||||
elif self.typesByCol[col] == TYPE_INPUT:
|
||||
if val == '0':
|
||||
terms.append(opNot + self.signalsByCol[col])
|
||||
if nonzero and len(terms) == 1:
|
||||
line = line + ') ' + opOr + '\n (';
|
||||
elif len(terms) == 1:
|
||||
line = line + '\n ('
|
||||
nonzero = True
|
||||
elif val == '1':
|
||||
terms.append(self.signalsByCol[col])
|
||||
if nonzero and len(terms) == 1:
|
||||
line = line + ') ' + opOr + '\n (';
|
||||
elif len(terms) == 1:
|
||||
line = line + '\n ('
|
||||
nonzero = True
|
||||
else:
|
||||
error('Table ' + self.name +': unexpected value in spec column ' + str(col) + ' (' + str(val) + ')')
|
||||
if len(terms) > 0:
|
||||
line = line + (' ' + opAnd + ' ').join(terms)
|
||||
if not nonzero:
|
||||
line = line + zero + ";";
|
||||
else:
|
||||
line = line + ');'
|
||||
self.equations.append(line)
|
||||
|
||||
return self.equations
|
||||
|
||||
def printv(self):
|
||||
self.makeRTL()
|
||||
print('\n'.join(self.equations))
|
||||
|
||||
def printinfo(self):
|
||||
print('Table: ' + self.name)
|
||||
print
|
||||
for l in self.source:
|
||||
print(l)
|
||||
print
|
||||
print('Signals by column:')
|
||||
for col in sorted(self.signalsByCol):
|
||||
print('{0:>3}. {1:} ({2:}) '.format(col, self.signalsByCol[col], 'in' if self.typesByCol[col] == TYPE_INPUT else 'out'))
|
||||
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# Functions
|
||||
|
||||
def error(msg, quitOverride=None):
|
||||
print('*** ' + msg)
|
||||
if quitOverride == False:
|
||||
1
|
||||
elif (quitOverride == None) or failOnError:
|
||||
quit(-10)
|
||||
elif quitOverride:
|
||||
quit(-10)
|
||||
|
||||
#--------------------------------------------------------------------------------------------------
|
||||
# Do something
|
||||
|
||||
if not verilog:
|
||||
openBracket = '('
|
||||
closeBracket = ')'
|
||||
opAnd = 'and'
|
||||
opOr = 'or'
|
||||
opNot = 'not '
|
||||
zero = "'0'"
|
||||
tablePattern = re.compile(r'^\s*?--tbl(?:\s+([^\s]+).*$|\s*$)')
|
||||
tableGenPattern = re.compile(r'^\s*?--vtable(?:\s+([^\s]+).*$)')
|
||||
commentPattern = re.compile(r'^\s*?(--.*$|\s*$)')
|
||||
tableLinePattern = re.compile(r'^.*?--(.*)')
|
||||
namePattern = re.compile(r'([a-zA-z\d_\(\)\.\[\]]+)')
|
||||
else:
|
||||
openBracket = '['
|
||||
closeBracket = ']'
|
||||
opAnd = '&'
|
||||
opOr = '|'
|
||||
opNot = '~'
|
||||
zero = "'b0"
|
||||
tablePattern = re.compile(r'^\s*?\/\/tbl(?:\s+([^\s]+).*$|\s*$)')
|
||||
tableGenPattern = re.compile(r'^\s*?\/\/vtable(?:\s+([^\s]+).*$)')
|
||||
commentPattern = re.compile(r'^\s*?(\/\/.*$|\s*$)')
|
||||
tableLinePattern = re.compile(r'^.*?\/\/(.*)')
|
||||
namePattern = re.compile(r'([a-zA-z\d_\(\)\.\[\]]+)')
|
||||
|
||||
# find the lines with table spec
|
||||
try:
|
||||
inf = open(inFile)
|
||||
for i, line in enumerate(inf):
|
||||
lines.append(line.strip('\n'))
|
||||
for match in re.finditer(tablePattern, line):
|
||||
tableMatches.append(i)
|
||||
inf.close()
|
||||
except Exception as e:
|
||||
error('Error opening input file ' + inFile + '\n' + str(e), True)
|
||||
|
||||
# validate matches; should be paired, nothing but comments and empties; table may be named
|
||||
# between them
|
||||
|
||||
for i in range(0, len(tableMatches), 2):
|
||||
|
||||
if i + 1 > len(tableMatches) - 1:
|
||||
error('Mismatched table tags.\nFound so far: ' + ', '.join(tableNames), True)
|
||||
|
||||
tLines = lines[tableMatches[i]:tableMatches[i+1]+1]
|
||||
tableLines.append(tLines)
|
||||
tName = re.match(tablePattern, lines[tableMatches[i]]).groups()[0]
|
||||
if tName is None:
|
||||
tName = 'noname_' + str(tableMatches[i] + 1)
|
||||
tableNames.append(tName)
|
||||
|
||||
for line in tLines:
|
||||
if not re.match(commentPattern, line):
|
||||
error('Found noncomment, nonempty line in table ' + tName + ':\n' + line, True)
|
||||
|
||||
print('Found tables: ' + ', '.join(tableNames))
|
||||
|
||||
# build table objects
|
||||
|
||||
for table, tName in zip(tableLines, tableNames):
|
||||
print('Parsing ' + tName + '...')
|
||||
namesByCol = {}
|
||||
colsByName = {}
|
||||
bitsByCol = {}
|
||||
typesByCol = {}
|
||||
specs = []
|
||||
|
||||
# parse the table - do by Table.parse()
|
||||
tLines = table[1:-1] # exclude --tbl
|
||||
for line in tLines:
|
||||
if line.strip() == '':
|
||||
continue
|
||||
try:
|
||||
spec = re.search(tableLinePattern, line).groups()[0]
|
||||
except Exception as e:
|
||||
error('Problem parsing table line:\n' + line, True)
|
||||
if len(spec) > 0:
|
||||
if spec[0] == 'n':
|
||||
for match in re.finditer(namePattern, spec[1:]):
|
||||
# col 0 is first col after n
|
||||
namesByCol[match.start()] = match.groups()[0]
|
||||
colsByName[match.groups()[0]] = match.start()
|
||||
elif spec[0] == 'b':
|
||||
for i, c in enumerate(spec[1:]):
|
||||
if c == ' ' or c == '|':
|
||||
continue
|
||||
try:
|
||||
bit = int(c)
|
||||
except:
|
||||
error('Unexpected char in bit line at position ' + str(i) + ' (' + c + ')\n' + line)
|
||||
bit = None
|
||||
if i in bitsByCol and bitsByCol[i] is not None:
|
||||
bitsByCol[i] = bitsByCol[i]*10+bit
|
||||
else:
|
||||
bitsByCol[i] = bit
|
||||
elif spec[0] == 't':
|
||||
for i, c in enumerate(spec[1:]):
|
||||
if c.lower() == 'i':
|
||||
typesByCol[i] = TYPE_INPUT
|
||||
elif c.lower() == 'o':
|
||||
typesByCol[i] = TYPE_OUTPUT
|
||||
elif c.lower() == '*':
|
||||
typesByCol[i] = TYPE_SKIP
|
||||
elif c != ' ':
|
||||
error('Unexpected char in type line at position ' + str(i) + ' (' + c + ')\n' + line)
|
||||
typesByCol[i] = None
|
||||
else:
|
||||
typesByCol[i] = None
|
||||
elif spec[0] == 's':
|
||||
specsByCol = {}
|
||||
for i, c in enumerate(spec[1:]):
|
||||
if c == '0' or c == '1':
|
||||
specsByCol[i] = c
|
||||
specs.append(specsByCol)
|
||||
else:
|
||||
#print('other:')
|
||||
#print(line)
|
||||
1
|
||||
|
||||
# create table object
|
||||
|
||||
# add strand to name where defined; don't combine for now into vector
|
||||
# consecutive strands belong to the last defined name
|
||||
lastName = None
|
||||
lastCol = 0
|
||||
signalsByCol = {}
|
||||
|
||||
for col,name in namesByCol.items(): # load with unstranded names
|
||||
signalsByCol[col] = name
|
||||
|
||||
# sort by col so consecutive columns can be easily tracked
|
||||
#for col,val in bitsByCol.items(): # update with stranded names
|
||||
for col in sorted(bitsByCol):
|
||||
val = bitsByCol[col]
|
||||
|
||||
if col > lastCol + 1:
|
||||
lastName = None
|
||||
if val is None:
|
||||
lastName = None
|
||||
if col in namesByCol:
|
||||
if val is None:
|
||||
signalsByCol[col] = namesByCol[col]
|
||||
else:
|
||||
lastName = namesByCol[col]
|
||||
signalsByCol[col] = lastName + openBracket + str(val) + closeBracket
|
||||
elif lastName is not None:
|
||||
signalsByCol[col] = lastName + openBracket + str(val) + closeBracket
|
||||
else:
|
||||
error('Can\'t associate bit number ' + str(val) + ' in column ' + str(col) + ' with a signal name.')
|
||||
lastCol = col
|
||||
|
||||
t = Table(tName)
|
||||
t.source = table
|
||||
t.signalsByCol = signalsByCol
|
||||
t.typesByCol = typesByCol
|
||||
t.specs = specs
|
||||
|
||||
tables[tName] = t
|
||||
|
||||
for name in tables:
|
||||
t = tables[name]
|
||||
t.validate()
|
||||
t.makeRTL()
|
||||
|
||||
print()
|
||||
print('Results:')
|
||||
|
||||
# find the lines with generate spec and replace them with new version
|
||||
outLines = []
|
||||
inTable = False
|
||||
for i, line in enumerate(lines):
|
||||
if not inTable:
|
||||
match = re.search(tableGenPattern, line)
|
||||
if match is not None:
|
||||
tName = match.groups(1)[0]
|
||||
if tName not in tables:
|
||||
if tName == 1:
|
||||
tName = '<blank>'
|
||||
error('Found vtable start for \'' + tName + '\' but didn\'t generate that table: line ' + str(i+1) + '\n' + line, True)
|
||||
else:
|
||||
outLines.append(line)
|
||||
outLines += tables[tName].equations
|
||||
tables[tName].added = True
|
||||
inTable = True
|
||||
else:
|
||||
outLines.append(line)
|
||||
else:
|
||||
match = re.search(tableGenPattern, line)
|
||||
if match is not None:
|
||||
if match.groups(1)[0] != tName:
|
||||
error('Found vtable end for \'' + match.groups(1)[0] + '\' but started table \'' + tName + '\': line ' + str(i+1) + '\n' + line, True)
|
||||
outLines.append(line)
|
||||
inTable = False
|
||||
else:
|
||||
1#print('stripped: ' + line)
|
||||
|
||||
if backup:
|
||||
try:
|
||||
copyfile(inFile, backupFile)
|
||||
except Exception as e:
|
||||
error('Error creating backup file!\n' + str(e), True)
|
||||
|
||||
try:
|
||||
of = open(outFile, 'w')
|
||||
for line in outLines:
|
||||
of.write("%s\n" % line)
|
||||
except Exception as e:
|
||||
error('Error writing output file ' + outFile + '!\n' + str(e), True)
|
||||
|
||||
print('Generated ' + str(len(tables)) + ' tables: ' + ', '.join(tableNames))
|
||||
notAdded = {}
|
||||
for table in tables:
|
||||
if not tables[table].added:
|
||||
notAdded[table] = True
|
||||
print('Output file: ' + outFile)
|
||||
if backup:
|
||||
print('Backup file: ' + backupFile)
|
||||
if len(notAdded) != 0:
|
||||
error('Tables generated but not added to file! ' + ', '.join(notAdded))
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,281 +0,0 @@
|
||||
// © IBM Corp. 2022
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
||||
// the terms below; you may not use the files in this repository except in
|
||||
// compliance with the License as modified.
|
||||
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Modified Terms:
|
||||
//
|
||||
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
||||
// License, the "Work" hereby includes implementations of the work of authorship
|
||||
// in physical form.
|
||||
//
|
||||
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
||||
// necessary for implementation of the Work that are available from OpenPOWER
|
||||
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
||||
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
||||
// of the EULA.
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, the reference design
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
||||
// for the specific language governing permissions and limitations under the License.
|
||||
//
|
||||
// Additional rights, including the ability to physically implement a softcore that
|
||||
// is compliant with the required sections of the Power ISA Specification, are
|
||||
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
||||
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
||||
|
||||
`timescale 1 ns / 1 ns
|
||||
|
||||
//*****************************************************************************
|
||||
// Description: Tri Array Wrapper
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
// sim version, clk1x
|
||||
|
||||
`include "tri_a2o.vh"
|
||||
|
||||
module tri_128x16_1r1w_1(
|
||||
vdd,
|
||||
vcs,
|
||||
gnd,
|
||||
nclk,
|
||||
rd_act,
|
||||
wr_act,
|
||||
lcb_d_mode_dc,
|
||||
lcb_clkoff_dc_b,
|
||||
lcb_mpw1_dc_b,
|
||||
lcb_mpw2_dc_b,
|
||||
lcb_delay_lclkr_dc,
|
||||
ccflush_dc,
|
||||
scan_dis_dc_b,
|
||||
scan_diag_dc,
|
||||
func_scan_in,
|
||||
func_scan_out,
|
||||
lcb_sg_0,
|
||||
lcb_sl_thold_0_b,
|
||||
lcb_time_sl_thold_0,
|
||||
lcb_abst_sl_thold_0,
|
||||
lcb_ary_nsl_thold_0,
|
||||
lcb_repr_sl_thold_0,
|
||||
time_scan_in,
|
||||
time_scan_out,
|
||||
abst_scan_in,
|
||||
abst_scan_out,
|
||||
repr_scan_in,
|
||||
repr_scan_out,
|
||||
abist_di,
|
||||
abist_bw_odd,
|
||||
abist_bw_even,
|
||||
abist_wr_adr,
|
||||
wr_abst_act,
|
||||
abist_rd0_adr,
|
||||
rd0_abst_act,
|
||||
tc_lbist_ary_wrt_thru_dc,
|
||||
abist_ena_1,
|
||||
abist_g8t_rd0_comp_ena,
|
||||
abist_raw_dc_b,
|
||||
obs0_abist_cmp,
|
||||
lcb_bolt_sl_thold_0,
|
||||
pc_bo_enable_2,
|
||||
pc_bo_reset,
|
||||
pc_bo_unload,
|
||||
pc_bo_repair,
|
||||
pc_bo_shdata,
|
||||
pc_bo_select,
|
||||
bo_pc_failout,
|
||||
bo_pc_diagloop,
|
||||
tri_lcb_mpw1_dc_b,
|
||||
tri_lcb_mpw2_dc_b,
|
||||
tri_lcb_delay_lclkr_dc,
|
||||
tri_lcb_clkoff_dc_b,
|
||||
tri_lcb_act_dis_dc,
|
||||
bw,
|
||||
wr_adr,
|
||||
rd_adr,
|
||||
di,
|
||||
dout
|
||||
);
|
||||
parameter addressable_ports = 128; // number of addressable register in this array
|
||||
parameter addressbus_width = 7; // width of the bus to address all ports (2^addressbus_width >= addressable_ports)
|
||||
parameter port_bitwidth = 16; // bitwidth of ports
|
||||
parameter ways = 1; // number of ways
|
||||
|
||||
// POWER PINS
|
||||
inout vdd;
|
||||
inout vcs;
|
||||
inout gnd;
|
||||
|
||||
input [0:`NCLK_WIDTH-1] nclk;
|
||||
|
||||
input rd_act;
|
||||
input wr_act;
|
||||
|
||||
// DC TEST PINS
|
||||
input lcb_d_mode_dc;
|
||||
input lcb_clkoff_dc_b;
|
||||
input [0:4] lcb_mpw1_dc_b;
|
||||
input lcb_mpw2_dc_b;
|
||||
input [0:4] lcb_delay_lclkr_dc;
|
||||
|
||||
input ccflush_dc;
|
||||
input scan_dis_dc_b;
|
||||
input scan_diag_dc;
|
||||
input func_scan_in;
|
||||
output func_scan_out;
|
||||
|
||||
input lcb_sg_0;
|
||||
input lcb_sl_thold_0_b;
|
||||
input lcb_time_sl_thold_0;
|
||||
input lcb_abst_sl_thold_0;
|
||||
input lcb_ary_nsl_thold_0;
|
||||
input lcb_repr_sl_thold_0;
|
||||
input time_scan_in;
|
||||
output time_scan_out;
|
||||
input abst_scan_in;
|
||||
output abst_scan_out;
|
||||
input repr_scan_in;
|
||||
output repr_scan_out;
|
||||
|
||||
input [0:3] abist_di;
|
||||
input abist_bw_odd;
|
||||
input abist_bw_even;
|
||||
input [0:6] abist_wr_adr;
|
||||
input wr_abst_act;
|
||||
input [0:6] abist_rd0_adr;
|
||||
input rd0_abst_act;
|
||||
input tc_lbist_ary_wrt_thru_dc;
|
||||
input abist_ena_1;
|
||||
input abist_g8t_rd0_comp_ena;
|
||||
input abist_raw_dc_b;
|
||||
input [0:3] obs0_abist_cmp;
|
||||
|
||||
// BOLT-ON
|
||||
input lcb_bolt_sl_thold_0;
|
||||
input pc_bo_enable_2; // general bolt-on enable
|
||||
input pc_bo_reset; // reset
|
||||
input pc_bo_unload; // unload sticky bits
|
||||
input pc_bo_repair; // execute sticky bit decode
|
||||
input pc_bo_shdata; // shift data for timing write and diag loop
|
||||
input pc_bo_select; // select for mask and hier writes
|
||||
output bo_pc_failout; // fail/no-fix reg
|
||||
output bo_pc_diagloop;
|
||||
input tri_lcb_mpw1_dc_b;
|
||||
input tri_lcb_mpw2_dc_b;
|
||||
input tri_lcb_delay_lclkr_dc;
|
||||
input tri_lcb_clkoff_dc_b;
|
||||
input tri_lcb_act_dis_dc;
|
||||
|
||||
input [0:15] bw;
|
||||
input [0:6] wr_adr;
|
||||
input [0:6] rd_adr;
|
||||
input [0:15] di;
|
||||
|
||||
output [0:15] dout;
|
||||
|
||||
// tri_128x16_1r1w_1
|
||||
|
||||
// Configuration Statement for NCsim
|
||||
//for all:ramb16_s36_s36 use entity unisim.RAMB16_S36_S36;
|
||||
|
||||
wire clk;
|
||||
wire [0:8] b0addra;
|
||||
wire [0:8] b0addrb;
|
||||
wire wea;
|
||||
wire web;
|
||||
wire wren_a;
|
||||
wire [0:15] w_data_in_0;
|
||||
wire [0:15] r_data_out_0_bram;
|
||||
|
||||
// Latches
|
||||
reg reset_q;
|
||||
reg [0:15] r_data_out_1_q;
|
||||
|
||||
|
||||
(* analysis_not_referenced="true" *)
|
||||
wire unused;
|
||||
|
||||
// sim array
|
||||
reg [0:15] mem[0:127];
|
||||
|
||||
integer i;
|
||||
initial begin
|
||||
for (i = 0; i < 128; i = i + 1)
|
||||
mem[i] = 0;
|
||||
end
|
||||
|
||||
//wtf:icarus $dumpvars cannot dump a vpiMemory
|
||||
generate
|
||||
genvar j;
|
||||
for (j = 0; j < 128; j=j+1) begin: loc
|
||||
wire [0:15] dat;
|
||||
assign dat = mem[j][0:15];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
assign clk = nclk[0];
|
||||
|
||||
always @(posedge clk)
|
||||
begin: rlatch
|
||||
reset_q <= nclk[1];
|
||||
end
|
||||
|
||||
assign b0addra[2:8] = wr_adr;
|
||||
assign b0addrb[2:8] = rd_adr;
|
||||
|
||||
// Unused Address Bits
|
||||
assign b0addra[0:1] = 2'b00;
|
||||
assign b0addrb[0:1] = 2'b00;
|
||||
|
||||
// port a is a read-modify-write port
|
||||
assign wren_a = (bw != 0) & wr_act;
|
||||
assign wea = wren_a;
|
||||
assign web = 1'b0;
|
||||
assign w_data_in_0[0] = bw[0] ? di[0] : r_data_out_0_bram[0];
|
||||
assign w_data_in_0[1] = bw[1] ? di[1] : r_data_out_0_bram[1];
|
||||
assign w_data_in_0[2] = bw[2] ? di[2] : r_data_out_0_bram[2];
|
||||
assign w_data_in_0[3] = bw[3] ? di[3] : r_data_out_0_bram[3];
|
||||
assign w_data_in_0[4] = bw[4] ? di[4] : r_data_out_0_bram[4];
|
||||
assign w_data_in_0[5] = bw[5] ? di[5] : r_data_out_0_bram[5];
|
||||
assign w_data_in_0[6] = bw[6] ? di[6] : r_data_out_0_bram[6];
|
||||
assign w_data_in_0[7] = bw[7] ? di[7] : r_data_out_0_bram[7];
|
||||
assign w_data_in_0[8] = bw[8] ? di[8] : r_data_out_0_bram[8];
|
||||
assign w_data_in_0[9] = bw[9] ? di[9] : r_data_out_0_bram[9];
|
||||
assign w_data_in_0[10] = bw[10] ? di[10] : r_data_out_0_bram[10];
|
||||
assign w_data_in_0[11] = bw[11] ? di[11] : r_data_out_0_bram[11];
|
||||
assign w_data_in_0[12] = bw[12] ? di[12] : r_data_out_0_bram[12];
|
||||
assign w_data_in_0[13] = bw[13] ? di[13] : r_data_out_0_bram[13];
|
||||
assign w_data_in_0[14] = bw[14] ? di[14] : r_data_out_0_bram[14];
|
||||
assign w_data_in_0[15] = bw[15] ? di[15] : r_data_out_0_bram[15];
|
||||
|
||||
always @(posedge clk) begin
|
||||
|
||||
r_data_out_1_q <= mem[b0addrb];
|
||||
if (wea) begin
|
||||
mem[b0addra] <= w_data_in_0;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
assign r_data_out_0_bram = mem[b0addra];
|
||||
assign dout = r_data_out_1_q[0:15];
|
||||
|
||||
assign func_scan_out = func_scan_in;
|
||||
assign time_scan_out = time_scan_in;
|
||||
assign abst_scan_out = abst_scan_in;
|
||||
assign repr_scan_out = repr_scan_in;
|
||||
|
||||
assign bo_pc_failout = 1'b0;
|
||||
assign bo_pc_diagloop = 1'b0;
|
||||
|
||||
assign unused = |{vdd, vcs, gnd, nclk, lcb_d_mode_dc, lcb_clkoff_dc_b, lcb_mpw1_dc_b, lcb_mpw2_dc_b,
|
||||
lcb_delay_lclkr_dc, ccflush_dc, scan_dis_dc_b, scan_diag_dc, lcb_sg_0, lcb_sl_thold_0_b,
|
||||
lcb_time_sl_thold_0, lcb_abst_sl_thold_0, lcb_ary_nsl_thold_0, lcb_repr_sl_thold_0,
|
||||
abist_di, abist_bw_odd, abist_bw_even, abist_wr_adr, wr_abst_act, abist_rd0_adr, rd0_abst_act,
|
||||
tc_lbist_ary_wrt_thru_dc, abist_ena_1, abist_g8t_rd0_comp_ena, abist_raw_dc_b, obs0_abist_cmp,
|
||||
lcb_bolt_sl_thold_0, pc_bo_enable_2, pc_bo_reset, pc_bo_unload, pc_bo_repair, pc_bo_shdata,
|
||||
pc_bo_select, tri_lcb_mpw1_dc_b, tri_lcb_mpw2_dc_b, tri_lcb_delay_lclkr_dc, tri_lcb_clkoff_dc_b,
|
||||
tri_lcb_act_dis_dc, rd_act};
|
||||
endmodule
|
@ -1,157 +0,0 @@
|
||||
// © IBM Corp. 2022
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
||||
// the terms below; you may not use the files in this repository except in
|
||||
// compliance with the License as modified.
|
||||
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Modified Terms:
|
||||
//
|
||||
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
||||
// License, the "Work" hereby includes implementations of the work of authorship
|
||||
// in physical form.
|
||||
//
|
||||
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
||||
// necessary for implementation of the Work that are available from OpenPOWER
|
||||
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
||||
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
||||
// of the EULA.
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, the reference design
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
||||
// for the specific language governing permissions and limitations under the License.
|
||||
//
|
||||
// Additional rights, including the ability to physically implement a softcore that
|
||||
// is compliant with the required sections of the Power ISA Specification, are
|
||||
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
||||
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
||||
|
||||
`timescale 1 ns / 1 ns
|
||||
|
||||
//*****************************************************************************
|
||||
// Description: Tri-Lam Array Wrapper
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
// sim version, clk1x
|
||||
|
||||
`include "tri_a2o.vh"
|
||||
|
||||
module tri_144x78_2r4w(
|
||||
// Inputs
|
||||
// Power
|
||||
inout vdd,
|
||||
inout gnd,
|
||||
// Clock & Scan
|
||||
input [0:`NCLK_WIDTH-1] nclk,
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Pervasive
|
||||
//-------------------------------------------------------------------
|
||||
input delay_lclkr_dc,
|
||||
input mpw1_dc_b,
|
||||
input mpw2_dc_b,
|
||||
input func_sl_force,
|
||||
input func_sl_thold_0_b,
|
||||
input func_slp_sl_force,
|
||||
input func_slp_sl_thold_0_b,
|
||||
input sg_0,
|
||||
input scan_in,
|
||||
output scan_out,
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Read Port
|
||||
//-------------------------------------------------------------------
|
||||
input r_late_en_1,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r_addr_in_1,
|
||||
output [64-`GPR_WIDTH:77] r_data_out_1,
|
||||
input r_late_en_2,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r_addr_in_2,
|
||||
output [64-`GPR_WIDTH:77] r_data_out_2,
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Write Port
|
||||
//-------------------------------------------------------------------
|
||||
input w_late_en_1,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w_addr_in_1,
|
||||
input [64-`GPR_WIDTH:77] w_data_in_1,
|
||||
input w_late_en_2,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w_addr_in_2,
|
||||
input [64-`GPR_WIDTH:77] w_data_in_2,
|
||||
input w_late_en_3,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w_addr_in_3,
|
||||
input [64-`GPR_WIDTH:77] w_data_in_3,
|
||||
input w_late_en_4,
|
||||
input [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] w_addr_in_4,
|
||||
input [64-`GPR_WIDTH:77] w_data_in_4
|
||||
);
|
||||
|
||||
wire unused;
|
||||
|
||||
// sim array
|
||||
reg [64-`GPR_WIDTH:77] mem[0:143];
|
||||
|
||||
reg [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r1a_q;
|
||||
wire [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r1a_d;
|
||||
reg [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r2a_q;
|
||||
wire [0:`GPR_POOL_ENC+`THREADS_POOL_ENC-1] r2a_d;
|
||||
|
||||
reg [64-`GPR_WIDTH:77] r1d_q;
|
||||
wire [64-`GPR_WIDTH:77] r1d_d;
|
||||
reg [64-`GPR_WIDTH:77] r2d_q;
|
||||
wire [64-`GPR_WIDTH:77] r2d_d;
|
||||
|
||||
integer i;
|
||||
initial begin
|
||||
for (i = 0; i < 144; i = i + 1)
|
||||
mem[i] = 0;
|
||||
end
|
||||
|
||||
//wtf:icarus $dumpvars cannot dump a vpiMemory
|
||||
generate
|
||||
genvar j;
|
||||
for (j = 0; j < 144; j=j+1) begin: loc
|
||||
wire [64-`GPR_WIDTH:63] dat;
|
||||
wire [0:7] par;
|
||||
// 4b0
|
||||
assign dat = mem[j][64-`GPR_WIDTH:63];
|
||||
assign par = mem[j][64:63 + `GPR_WIDTH/8];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
assign r1a_d = r_addr_in_1;
|
||||
assign r2a_d = r_addr_in_2;
|
||||
|
||||
always @(posedge nclk[0]) begin
|
||||
|
||||
r1a_q <= r1a_d;
|
||||
r2a_q <= r2a_d;
|
||||
|
||||
r1d_q <= r1d_d;
|
||||
r2d_q <= r2d_d;
|
||||
|
||||
if (w_late_en_1) begin
|
||||
mem[w_addr_in_1] <= w_data_in_1;
|
||||
end
|
||||
if (w_late_en_2) begin
|
||||
mem[w_addr_in_2] <= w_data_in_2;
|
||||
end
|
||||
if (w_late_en_3) begin
|
||||
mem[w_addr_in_3] <= w_data_in_3;
|
||||
end
|
||||
if (w_late_en_4) begin
|
||||
mem[w_addr_in_4] <= w_data_in_4;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
// r_late_en_x are unused in original also
|
||||
assign r1d_d = mem[r1a_q];
|
||||
assign r2d_d = mem[r2a_q];
|
||||
|
||||
assign r_data_out_1 = r1d_q;
|
||||
assign r_data_out_2 = r2d_q;
|
||||
|
||||
assign unused = | {func_slp_sl_force, func_slp_sl_thold_0_b};
|
||||
|
||||
endmodule
|
@ -1,273 +0,0 @@
|
||||
// © IBM Corp. 2022
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
||||
// the terms below; you may not use the files in this repository except in
|
||||
// compliance with the License as modified.
|
||||
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Modified Terms:
|
||||
//
|
||||
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
||||
// License, the "Work" hereby includes implementations of the work of authorship
|
||||
// in physical form.
|
||||
//
|
||||
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
||||
// necessary for implementation of the Work that are available from OpenPOWER
|
||||
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
||||
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
||||
// of the EULA.
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, the reference design
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
||||
// for the specific language governing permissions and limitations under the License.
|
||||
//
|
||||
// Additional rights, including the ability to physically implement a softcore that
|
||||
// is compliant with the required sections of the Power ISA Specification, are
|
||||
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
||||
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
||||
|
||||
`timescale 1 ns / 1 ns
|
||||
|
||||
//*****************************************************************************
|
||||
// Description: Tri Array Wrapper
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
// sim version, clk1x
|
||||
|
||||
`include "tri_a2o.vh"
|
||||
|
||||
module tri_512x16_1r1w_1(
|
||||
vdd,
|
||||
vcs,
|
||||
gnd,
|
||||
nclk,
|
||||
rd_act,
|
||||
wr_act,
|
||||
lcb_d_mode_dc,
|
||||
lcb_clkoff_dc_b,
|
||||
lcb_mpw1_dc_b,
|
||||
lcb_mpw2_dc_b,
|
||||
lcb_delay_lclkr_dc,
|
||||
ccflush_dc,
|
||||
scan_dis_dc_b,
|
||||
scan_diag_dc,
|
||||
func_scan_in,
|
||||
func_scan_out,
|
||||
lcb_sg_0,
|
||||
lcb_sl_thold_0_b,
|
||||
lcb_time_sl_thold_0,
|
||||
lcb_abst_sl_thold_0,
|
||||
lcb_ary_nsl_thold_0,
|
||||
lcb_repr_sl_thold_0,
|
||||
time_scan_in,
|
||||
time_scan_out,
|
||||
abst_scan_in,
|
||||
abst_scan_out,
|
||||
repr_scan_in,
|
||||
repr_scan_out,
|
||||
abist_di,
|
||||
abist_bw_odd,
|
||||
abist_bw_even,
|
||||
abist_wr_adr,
|
||||
wr_abst_act,
|
||||
abist_rd0_adr,
|
||||
rd0_abst_act,
|
||||
tc_lbist_ary_wrt_thru_dc,
|
||||
abist_ena_1,
|
||||
abist_g8t_rd0_comp_ena,
|
||||
abist_raw_dc_b,
|
||||
obs0_abist_cmp,
|
||||
lcb_bolt_sl_thold_0,
|
||||
pc_bo_enable_2,
|
||||
pc_bo_reset,
|
||||
pc_bo_unload,
|
||||
pc_bo_repair,
|
||||
pc_bo_shdata,
|
||||
pc_bo_select,
|
||||
bo_pc_failout,
|
||||
bo_pc_diagloop,
|
||||
tri_lcb_mpw1_dc_b,
|
||||
tri_lcb_mpw2_dc_b,
|
||||
tri_lcb_delay_lclkr_dc,
|
||||
tri_lcb_clkoff_dc_b,
|
||||
tri_lcb_act_dis_dc,
|
||||
bw,
|
||||
wr_adr,
|
||||
rd_adr,
|
||||
di,
|
||||
dout
|
||||
);
|
||||
parameter addressable_ports = 128; // number of addressable register in this array
|
||||
parameter addressbus_width = 9; // width of the bus to address all ports (2^addressbus_width >= addressable_ports)
|
||||
parameter port_bitwidth = 16; // bitwidth of ports
|
||||
parameter ways = 1; // number of ways
|
||||
|
||||
// POWER PINS
|
||||
inout vdd;
|
||||
inout vcs;
|
||||
inout gnd;
|
||||
|
||||
input [0:`NCLK_WIDTH-1] nclk;
|
||||
|
||||
input rd_act;
|
||||
input wr_act;
|
||||
|
||||
// DC TEST PINS
|
||||
input lcb_d_mode_dc;
|
||||
input lcb_clkoff_dc_b;
|
||||
input [0:4] lcb_mpw1_dc_b;
|
||||
input lcb_mpw2_dc_b;
|
||||
input [0:4] lcb_delay_lclkr_dc;
|
||||
|
||||
input ccflush_dc;
|
||||
input scan_dis_dc_b;
|
||||
input scan_diag_dc;
|
||||
input func_scan_in;
|
||||
output func_scan_out;
|
||||
|
||||
input lcb_sg_0;
|
||||
input lcb_sl_thold_0_b;
|
||||
input lcb_time_sl_thold_0;
|
||||
input lcb_abst_sl_thold_0;
|
||||
input lcb_ary_nsl_thold_0;
|
||||
input lcb_repr_sl_thold_0;
|
||||
input time_scan_in;
|
||||
output time_scan_out;
|
||||
input abst_scan_in;
|
||||
output abst_scan_out;
|
||||
input repr_scan_in;
|
||||
output repr_scan_out;
|
||||
|
||||
input [0:3] abist_di;
|
||||
input abist_bw_odd;
|
||||
input abist_bw_even;
|
||||
input [0:6] abist_wr_adr;
|
||||
input wr_abst_act;
|
||||
input [0:6] abist_rd0_adr;
|
||||
input rd0_abst_act;
|
||||
input tc_lbist_ary_wrt_thru_dc;
|
||||
input abist_ena_1;
|
||||
input abist_g8t_rd0_comp_ena;
|
||||
input abist_raw_dc_b;
|
||||
input [0:3] obs0_abist_cmp;
|
||||
|
||||
// BOLT-ON
|
||||
input lcb_bolt_sl_thold_0;
|
||||
input pc_bo_enable_2; // general bolt-on enable
|
||||
input pc_bo_reset; // reset
|
||||
input pc_bo_unload; // unload sticky bits
|
||||
input pc_bo_repair; // execute sticky bit decode
|
||||
input pc_bo_shdata; // shift data for timing write and diag loop
|
||||
input pc_bo_select; // select for mask and hier writes
|
||||
output bo_pc_failout; // fail/no-fix reg
|
||||
output bo_pc_diagloop;
|
||||
input tri_lcb_mpw1_dc_b;
|
||||
input tri_lcb_mpw2_dc_b;
|
||||
input tri_lcb_delay_lclkr_dc;
|
||||
input tri_lcb_clkoff_dc_b;
|
||||
input tri_lcb_act_dis_dc;
|
||||
|
||||
input [0:15] bw;
|
||||
input [0:8] wr_adr;
|
||||
input [0:8] rd_adr;
|
||||
input [0:15] di;
|
||||
|
||||
output [0:15] dout;
|
||||
|
||||
wire clk;
|
||||
wire [0:8] b0addra;
|
||||
wire [0:8] b0addrb;
|
||||
wire wea;
|
||||
wire web;
|
||||
wire wren_a;
|
||||
wire [0:15] w_data_in_0;
|
||||
wire [0:15] r_data_out_0_bram;
|
||||
|
||||
// Latches
|
||||
reg reset_q;
|
||||
reg [0:15] r_data_out_1_q;
|
||||
|
||||
|
||||
(* analysis_not_referenced="true" *)
|
||||
wire unused;
|
||||
|
||||
// sim array
|
||||
reg [0:15] mem[0:511];
|
||||
|
||||
integer i;
|
||||
initial begin
|
||||
for (i = 0; i < 512; i = i + 1)
|
||||
mem[i] = 0;
|
||||
end
|
||||
|
||||
//wtf:icarus $dumpvars cannot dump a vpiMemory
|
||||
generate
|
||||
genvar j;
|
||||
for (j = 0; j < 512; j=j+1) begin: loc
|
||||
wire [0:15] dat;
|
||||
assign dat = mem[j][0:15];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
assign clk = nclk[0];
|
||||
|
||||
always @(posedge clk)
|
||||
begin: rlatch
|
||||
reset_q <= nclk[1];
|
||||
end
|
||||
|
||||
//wtf do they use diff addresses?
|
||||
assign b0addra[0:8] = wr_adr;
|
||||
assign b0addrb[0:8] = rd_adr;
|
||||
|
||||
// port a is a read-modify-write port
|
||||
assign wren_a = (bw != 0) & wr_act;
|
||||
assign wea = wren_a;
|
||||
assign web = 1'b0;
|
||||
assign w_data_in_0[0] = bw[0] ? di[0] : r_data_out_0_bram[0];
|
||||
assign w_data_in_0[1] = bw[1] ? di[1] : r_data_out_0_bram[1];
|
||||
assign w_data_in_0[2] = bw[2] ? di[2] : r_data_out_0_bram[2];
|
||||
assign w_data_in_0[3] = bw[3] ? di[3] : r_data_out_0_bram[3];
|
||||
assign w_data_in_0[4] = bw[4] ? di[4] : r_data_out_0_bram[4];
|
||||
assign w_data_in_0[5] = bw[5] ? di[5] : r_data_out_0_bram[5];
|
||||
assign w_data_in_0[6] = bw[6] ? di[6] : r_data_out_0_bram[6];
|
||||
assign w_data_in_0[7] = bw[7] ? di[7] : r_data_out_0_bram[7];
|
||||
assign w_data_in_0[8] = bw[8] ? di[8] : r_data_out_0_bram[8];
|
||||
assign w_data_in_0[9] = bw[9] ? di[9] : r_data_out_0_bram[9];
|
||||
assign w_data_in_0[10] = bw[10] ? di[10] : r_data_out_0_bram[10];
|
||||
assign w_data_in_0[11] = bw[11] ? di[11] : r_data_out_0_bram[11];
|
||||
assign w_data_in_0[12] = bw[12] ? di[12] : r_data_out_0_bram[12];
|
||||
assign w_data_in_0[13] = bw[13] ? di[13] : r_data_out_0_bram[13];
|
||||
assign w_data_in_0[14] = bw[14] ? di[14] : r_data_out_0_bram[14];
|
||||
assign w_data_in_0[15] = bw[15] ? di[15] : r_data_out_0_bram[15];
|
||||
|
||||
always @(posedge clk) begin
|
||||
|
||||
r_data_out_1_q <= mem[b0addrb];
|
||||
if (wea) begin
|
||||
mem[b0addra] <= w_data_in_0;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
assign r_data_out_0_bram = mem[b0addra];
|
||||
assign dout = r_data_out_1_q[0:15];
|
||||
|
||||
assign func_scan_out = func_scan_in;
|
||||
assign time_scan_out = time_scan_in;
|
||||
assign abst_scan_out = abst_scan_in;
|
||||
assign repr_scan_out = repr_scan_in;
|
||||
|
||||
assign bo_pc_failout = 1'b0;
|
||||
assign bo_pc_diagloop = 1'b0;
|
||||
|
||||
assign unused = |{vdd, vcs, gnd, nclk, lcb_d_mode_dc, lcb_clkoff_dc_b, lcb_mpw1_dc_b, lcb_mpw2_dc_b,
|
||||
lcb_delay_lclkr_dc, ccflush_dc, scan_dis_dc_b, scan_diag_dc, lcb_sg_0, lcb_sl_thold_0_b,
|
||||
lcb_time_sl_thold_0, lcb_abst_sl_thold_0, lcb_ary_nsl_thold_0, lcb_repr_sl_thold_0,
|
||||
abist_di, abist_bw_odd, abist_bw_even, abist_wr_adr, wr_abst_act, abist_rd0_adr, rd0_abst_act,
|
||||
tc_lbist_ary_wrt_thru_dc, abist_ena_1, abist_g8t_rd0_comp_ena, abist_raw_dc_b, obs0_abist_cmp,
|
||||
lcb_bolt_sl_thold_0, pc_bo_enable_2, pc_bo_reset, pc_bo_unload, pc_bo_repair, pc_bo_shdata,
|
||||
pc_bo_select, tri_lcb_mpw1_dc_b, tri_lcb_mpw2_dc_b, tri_lcb_delay_lclkr_dc, tri_lcb_clkoff_dc_b,
|
||||
tri_lcb_act_dis_dc, rd_act};
|
||||
endmodule
|
@ -1,245 +0,0 @@
|
||||
// © IBM Corp. 2022
|
||||
// Licensed under the Apache License, Version 2.0 (the "License"), as modified by
|
||||
// the terms below; you may not use the files in this repository except in
|
||||
// compliance with the License as modified.
|
||||
// You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Modified Terms:
|
||||
//
|
||||
// 1) For the purpose of the patent license granted to you in Section 3 of the
|
||||
// License, the "Work" hereby includes implementations of the work of authorship
|
||||
// in physical form.
|
||||
//
|
||||
// 2) Notwithstanding any terms to the contrary in the License, any licenses
|
||||
// necessary for implementation of the Work that are available from OpenPOWER
|
||||
// via the Power ISA End User License Agreement (EULA) are explicitly excluded
|
||||
// hereunder, and may be obtained from OpenPOWER under the terms and conditions
|
||||
// of the EULA.
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, the reference design
|
||||
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
|
||||
// for the specific language governing permissions and limitations under the License.
|
||||
//
|
||||
// Additional rights, including the ability to physically implement a softcore that
|
||||
// is compliant with the required sections of the Power ISA Specification, are
|
||||
// available at no cost under the terms of the OpenPOWER Power ISA EULA, which can be
|
||||
// obtained (along with the Power ISA) here: https://openpowerfoundation.org.
|
||||
|
||||
`timescale 1 ns / 1 ns
|
||||
|
||||
//*****************************************************************************
|
||||
// Description: Tri-Lam Array Wrapper
|
||||
//
|
||||
//*****************************************************************************
|
||||
|
||||
// sim version, clk1x
|
||||
|
||||
`include "tri_a2o.vh"
|
||||
|
||||
module tri_64x72_1r1w(
|
||||
vdd,
|
||||
vcs,
|
||||
gnd,
|
||||
nclk,
|
||||
sg_0,
|
||||
abst_sl_thold_0,
|
||||
ary_nsl_thold_0,
|
||||
time_sl_thold_0,
|
||||
repr_sl_thold_0,
|
||||
rd0_act,
|
||||
rd0_adr,
|
||||
do0,
|
||||
wr_act,
|
||||
wr_adr,
|
||||
di,
|
||||
abst_scan_in,
|
||||
abst_scan_out,
|
||||
time_scan_in,
|
||||
time_scan_out,
|
||||
repr_scan_in,
|
||||
repr_scan_out,
|
||||
scan_dis_dc_b,
|
||||
scan_diag_dc,
|
||||
ccflush_dc,
|
||||
clkoff_dc_b,
|
||||
d_mode_dc,
|
||||
mpw1_dc_b,
|
||||
mpw2_dc_b,
|
||||
delay_lclkr_dc,
|
||||
lcb_bolt_sl_thold_0,
|
||||
pc_bo_enable_2,
|
||||
pc_bo_reset,
|
||||
pc_bo_unload,
|
||||
pc_bo_repair,
|
||||
pc_bo_shdata,
|
||||
pc_bo_select,
|
||||
bo_pc_failout,
|
||||
bo_pc_diagloop,
|
||||
tri_lcb_mpw1_dc_b,
|
||||
tri_lcb_mpw2_dc_b,
|
||||
tri_lcb_delay_lclkr_dc,
|
||||
tri_lcb_clkoff_dc_b,
|
||||
tri_lcb_act_dis_dc,
|
||||
abist_di,
|
||||
abist_bw_odd,
|
||||
abist_bw_even,
|
||||
abist_wr_adr,
|
||||
wr_abst_act,
|
||||
abist_rd0_adr,
|
||||
rd0_abst_act,
|
||||
tc_lbist_ary_wrt_thru_dc,
|
||||
abist_ena_1,
|
||||
abist_g8t_rd0_comp_ena,
|
||||
abist_raw_dc_b,
|
||||
obs0_abist_cmp
|
||||
);
|
||||
|
||||
// Power
|
||||
(* analysis_not_referenced="true" *)
|
||||
inout vdd;
|
||||
(* analysis_not_referenced="true" *)
|
||||
inout vcs;
|
||||
(* analysis_not_referenced="true" *)
|
||||
inout gnd;
|
||||
|
||||
// Clock Pervasive
|
||||
input [0:`NCLK_WIDTH-1] nclk;
|
||||
input sg_0;
|
||||
input abst_sl_thold_0;
|
||||
input ary_nsl_thold_0;
|
||||
input time_sl_thold_0;
|
||||
input repr_sl_thold_0;
|
||||
|
||||
// Reads
|
||||
input rd0_act;
|
||||
input [0:5] rd0_adr;
|
||||
output [64-`GPR_WIDTH:72-(64/`GPR_WIDTH)] do0;
|
||||
|
||||
// Writes
|
||||
input wr_act;
|
||||
input [0:5] wr_adr;
|
||||
input [64-`GPR_WIDTH:72-(64/`GPR_WIDTH)] di;
|
||||
|
||||
// Scan
|
||||
input abst_scan_in;
|
||||
output abst_scan_out;
|
||||
input time_scan_in;
|
||||
output time_scan_out;
|
||||
input repr_scan_in;
|
||||
output repr_scan_out;
|
||||
|
||||
// Misc Pervasive
|
||||
input scan_dis_dc_b;
|
||||
input scan_diag_dc;
|
||||
input ccflush_dc;
|
||||
input clkoff_dc_b;
|
||||
input d_mode_dc;
|
||||
input [0:4] mpw1_dc_b;
|
||||
input mpw2_dc_b;
|
||||
input [0:4] delay_lclkr_dc;
|
||||
|
||||
// BOLT-ON
|
||||
input lcb_bolt_sl_thold_0;
|
||||
input pc_bo_enable_2; // general bolt-on enable
|
||||
input pc_bo_reset; // reset
|
||||
input pc_bo_unload; // unload sticky bits
|
||||
input pc_bo_repair; // execute sticky bit decode
|
||||
input pc_bo_shdata; // shift data for timing write and diag loop
|
||||
input pc_bo_select; // select for mask and hier writes
|
||||
output bo_pc_failout; // fail/no-fix reg
|
||||
output bo_pc_diagloop;
|
||||
input tri_lcb_mpw1_dc_b;
|
||||
input tri_lcb_mpw2_dc_b;
|
||||
input tri_lcb_delay_lclkr_dc;
|
||||
input tri_lcb_clkoff_dc_b;
|
||||
input tri_lcb_act_dis_dc;
|
||||
|
||||
// ABIST
|
||||
input [0:3] abist_di;
|
||||
input abist_bw_odd;
|
||||
input abist_bw_even;
|
||||
input [0:5] abist_wr_adr;
|
||||
input wr_abst_act;
|
||||
input [0:5] abist_rd0_adr;
|
||||
input rd0_abst_act;
|
||||
input tc_lbist_ary_wrt_thru_dc;
|
||||
input abist_ena_1;
|
||||
input abist_g8t_rd0_comp_ena;
|
||||
input abist_raw_dc_b;
|
||||
input [0:3] obs0_abist_cmp;
|
||||
|
||||
wire sreset;
|
||||
wire [0:71] tidn;
|
||||
|
||||
(* analysis_not_referenced="true" *)
|
||||
wire unused;
|
||||
|
||||
// sim array
|
||||
reg [0:63] mem[0:71];
|
||||
|
||||
reg r0_e_q;
|
||||
wire r0_e_d;
|
||||
reg [0:5] r0_a_q;
|
||||
wire [0:5] r0_a_d;
|
||||
reg [0:71] r0_d_q;
|
||||
wire [0:71] r0_d_d;
|
||||
|
||||
reg w0_e_q;
|
||||
wire w0_e_d;
|
||||
reg [0:5] w0_a_q;
|
||||
wire [0:5] w0_a_d;
|
||||
reg [0:71] w0_d_q;
|
||||
wire [0:71] w0_d_d;
|
||||
|
||||
integer i;
|
||||
initial begin
|
||||
for (i = 0; i < 64; i = i + 1)
|
||||
mem[i] = 0;
|
||||
end
|
||||
|
||||
//wtf:icarus $dumpvars cannot dump a vpiMemory
|
||||
generate
|
||||
genvar j;
|
||||
for (j = 0; j < 63; j=j+1) begin: loc
|
||||
wire [0:63] dat;
|
||||
wire [0:7] par;
|
||||
assign dat = mem[j][0:63];
|
||||
assign par = mem[j][0:7];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
generate
|
||||
|
||||
assign clk = nclk[0];
|
||||
assign sreset = nclk[1];
|
||||
|
||||
always @(posedge clk) begin
|
||||
|
||||
r0_e_q <= rd0_act;
|
||||
r0_a_q <= rd0_adr;
|
||||
r0_d_q <= r0_e_q ? mem[r0_a_q] : 0;
|
||||
|
||||
if (w0_e_q) begin
|
||||
mem[w0_a_q] <= w0_d_q;
|
||||
end
|
||||
w0_e_q <= wr_act;
|
||||
w0_a_q <= wr_adr;
|
||||
w0_d_q <= di;
|
||||
|
||||
end
|
||||
|
||||
assign do0 = r0_d_q;
|
||||
|
||||
assign abst_scan_out = abst_scan_in;
|
||||
assign time_scan_out = time_scan_in;
|
||||
assign repr_scan_out = repr_scan_in;
|
||||
|
||||
assign bo_pc_failout = 1'b0;
|
||||
assign bo_pc_diagloop = 1'b0;
|
||||
|
||||
assign unused = | ({nclk[3:`NCLK_WIDTH-1], sg_0, abst_sl_thold_0, ary_nsl_thold_0, time_sl_thold_0, repr_sl_thold_0, scan_dis_dc_b, scan_diag_dc, ccflush_dc, clkoff_dc_b, d_mode_dc, mpw1_dc_b, mpw2_dc_b, delay_lclkr_dc, abist_di, abist_bw_odd, abist_bw_even, abist_wr_adr, abist_rd0_adr, wr_abst_act, rd0_abst_act, tc_lbist_ary_wrt_thru_dc, abist_ena_1, abist_g8t_rd0_comp_ena, abist_raw_dc_b, obs0_abist_cmp, rd0_act, tidn, lcb_bolt_sl_thold_0, pc_bo_enable_2, pc_bo_reset, pc_bo_unload, pc_bo_repair, pc_bo_shdata, pc_bo_select, tri_lcb_mpw1_dc_b, tri_lcb_mpw2_dc_b, tri_lcb_delay_lclkr_dc, tri_lcb_clkoff_dc_b, tri_lcb_act_dis_dc});
|
||||
|
||||
endgenerate
|
||||
|
||||
endmodule
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff