testing full litex software build
parent
6455cb5868
commit
20b16f1810
@ -0,0 +1,227 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# A2P Test from A2O 32BE Test (minimal changes to see if litex software compile works with a2p)
|
||||
# a2p_a2o_32.py --csr-csv csr.csv
|
||||
# a2p_a2o_32.py --csr-csv csr.csv --build [--sys-clk-freq 50e6]
|
||||
#
|
||||
|
||||
import os
|
||||
import argparse
|
||||
|
||||
from migen import *
|
||||
|
||||
# wtf - use local platform
|
||||
from platforms import cmod7
|
||||
#from platforms import cmod7_kintex
|
||||
|
||||
# wtf - use local core (not built into litex)
|
||||
# help python find package
|
||||
# not needed anymore
|
||||
#import sys
|
||||
#binPath = os.path.dirname(os.path.realpath(__file__))
|
||||
#sys.path.append(os.path.join(binPath, 'a2o')) # dir with core package; core.py defines core source location
|
||||
# get core def
|
||||
from a2p_new import A2P
|
||||
# add to litex dict
|
||||
from litex.soc.cores import cpu
|
||||
cpu.CPUS['a2p'] = A2P
|
||||
|
||||
from litex.soc.cores.clock import *
|
||||
from litex.soc.integration.soc import SoCRegion
|
||||
from litex.soc.integration.soc_core import *
|
||||
from litex.soc.integration.builder import *
|
||||
|
||||
from litex.soc.cores.led import LedChaser
|
||||
from litex.soc.cores import dna, xadc
|
||||
from litex.soc.cores.gpio import GPIOIn
|
||||
from litex.soc.cores.gpio import GPIOOut
|
||||
from litex.soc.cores.bitbang import I2CMaster
|
||||
|
||||
from litex.soc.interconnect import wishbone
|
||||
|
||||
from litex.soc.cores import uart
|
||||
from litex.soc.cores.uart import UART
|
||||
from litex.soc.cores.uart import UARTPHY
|
||||
from litex.soc.cores.uart import UARTWishboneBridge
|
||||
from litescope import LiteScopeAnalyzer
|
||||
|
||||
# CRG ----------------------------------------------------------------------------------------------
|
||||
|
||||
class _CRG(Module):
|
||||
def __init__(self, platform, sys_clk_freq):
|
||||
self.rst = Signal()
|
||||
self.clock_domains.cd_sys = ClockDomain()
|
||||
self.clock_domains.cd_sys2x = ClockDomain(reset_less=True)
|
||||
self.clock_domains.cd_idelay = ClockDomain()
|
||||
|
||||
self.submodules.pll = pll = S7MMCM(speedgrade=-1)
|
||||
#wtf how do you add btn to reset sig?
|
||||
#x = platform.request('user_btn',0)
|
||||
self.comb += pll.reset.eq(self.rst)
|
||||
#self.comb += pll.reset.eq(self.rst)
|
||||
pll.register_clkin(platform.request('clk12'), 12e6)
|
||||
pll.create_clkout(self.cd_sys, sys_clk_freq)
|
||||
pll.create_clkout(self.cd_sys2x, 2*sys_clk_freq)
|
||||
pll.create_clkout(self.cd_idelay, 200e6)
|
||||
platform.add_false_path_constraints(self.cd_sys.clk, pll.clkin) # Ignore sys_clk to pll.clkin path created by SoC's rst.
|
||||
|
||||
self.submodules.idelayctrl = S7IDELAYCTRL(self.cd_idelay)
|
||||
|
||||
def _to_signal(obj):
|
||||
return obj.raw_bits() if isinstance(obj, Record) else obj
|
||||
|
||||
class BaseSoC(SoCCore):
|
||||
|
||||
def __init__(self, sys_clk_freq=int(50e6),
|
||||
with_analyzer=False,
|
||||
uart_baudrate=115200,
|
||||
**kwargs):
|
||||
|
||||
coreUART = True
|
||||
#romSize = 128*1024
|
||||
#ramSize = 128*1024
|
||||
romSize = 64 * 1024;
|
||||
ramSize = 64 * 1024;
|
||||
ddrSize = 16*1024*1024
|
||||
|
||||
|
||||
# try build using different fpga's
|
||||
platform = cmod7.Platform()
|
||||
#platform = cmod7.Platform(fpga='xc7a200t-SBG484-1') # arty-200
|
||||
#platform = cmod7_kintex.Platform(fpga='xc7k325t-ffv676-1 ) # kintex-325
|
||||
#platform = cmod7_kintex.Platform(fpga='xc7k410t-ffv676-1') # kintex-410
|
||||
|
||||
SoCCore.__init__(self, platform, sys_clk_freq, csr_data_width=32,
|
||||
#with_uart=coreUART, integrated_rom_size=romSize, integrated_sram_size=ramSize, don't set rom/ram if doing it below!!!!!
|
||||
with_uart=coreUART, integrated_rom_size=0, integrated_sram_size=0,
|
||||
ident='A2P', ident_version=True, uart_baudrate=uart_baudrate,
|
||||
cpu_type='a2p', cpu_variant='WB')
|
||||
|
||||
print(f'Building variant={self.cpu.variant}.')
|
||||
|
||||
# no irq yet, but should be able to connect; need irq handler in crt0.s
|
||||
self.add_constant('UART_POLLING')
|
||||
# skip bios crc for sim
|
||||
#self.add_constant('CONFIG_BIOS_NO_CRC') # doesnt work?
|
||||
#self.add_config("BIOS_NO_CRC") # doesnt work?
|
||||
#had to -DCONFIG_BIOS_NO_CRC=1 in GCC_FLAGS
|
||||
|
||||
# this appears to be how to set up fixed csr order but not sure it works this way. https://github.com/litex-hub/linux-on-litex-vexriscv/blob/master/soc_linux.py
|
||||
#SoCCore.csr_map
|
||||
#self.csr_map = {**SoCCore.csr_map, **{
|
||||
#self.csr_map = {
|
||||
# 'ctrl': 0,
|
||||
# 'dna' : 1,
|
||||
# 'uart': 2,
|
||||
# 'i2c': 3,
|
||||
# 'leds': 4
|
||||
#}}
|
||||
#interrupt_map = {**soc_cls.interrupt_map, **{
|
||||
# 'uart': 0,
|
||||
# 'timer0': 1,
|
||||
#}}
|
||||
self.mem_map = {
|
||||
'rom': 0x00000000,
|
||||
'ram': 0x00010000,
|
||||
'main_ram': 0x01000000,
|
||||
'csr': 0xFFF00000
|
||||
}
|
||||
|
||||
# CRG --------------------------------------------------------------------------------------
|
||||
self.submodules.crg = _CRG(platform, sys_clk_freq)
|
||||
|
||||
if not coreUART:
|
||||
self.submodules.serial_bridge = UARTWishboneBridge(platform.request('serial'), sys_clk_freq)
|
||||
self.add_wb_master(self.serial_bridge.wishbone)
|
||||
|
||||
self.add_csr('node_ctl')
|
||||
self.add_csr('node_config')
|
||||
self.add_csr('node_status')
|
||||
|
||||
# ON-BOARD MEM ------------------------------------------------------------------------------
|
||||
|
||||
with open('rom.init', 'r') as file:
|
||||
hexdata = file.read().replace('\n', '')
|
||||
|
||||
#a2o how will this work for a2o? should allow 32BE or 64LE to load kernel+bios
|
||||
# 1. core resets to 32BE
|
||||
# 2. probably want to link kernel+bios in same mode, so have kernel deal with possible mode switch
|
||||
# 3. load mem here in proper mode based on variant (A2O_32BE or A2O64_LE)
|
||||
|
||||
outFile = open('mem_init', 'w') # write data immediately so available even if not building (sim)
|
||||
# this seems to work (specified in BE in rom.init, instructions are decoded properly)
|
||||
# BUT, vivado wants each line to be 4B to match width (at least for sim)
|
||||
bytedata = []
|
||||
for i in range(0, len(hexdata), 8):
|
||||
data = int(hexdata[i+6:i+8] + hexdata[i+4:i+6] + hexdata[i+2:i+4] + hexdata[i:i+2], 16) # BE->LE
|
||||
bytedata.append(data)
|
||||
outFile.write(hexdata[i+6:i+8] + hexdata[i+4:i+6] + hexdata[i+2:i+4] + hexdata[i:i+2] + '\n')
|
||||
#bytedata.append(int(hexdata[i:i+2] + hexdata[i+2:i+4] + hexdata[i+4:i+6] + hexdata[i+6:i+8], 16))
|
||||
romdata = bytedata
|
||||
print('Read ' + str(len(romdata)) + ' bytes for ROM data.')
|
||||
outFile.close()
|
||||
print('Wrote mem.init')
|
||||
|
||||
self.add_rom('rom', origin=self.mem_map['rom'], size=romSize, contents=romdata) # name, origin, size, contents=[], mode='r'
|
||||
# make this sram to match what linker expects
|
||||
self.add_ram('sram', origin=self.mem_map['ram'], size=ramSize) # name, origin, size, contents=[], mode='rw'
|
||||
|
||||
# External Mem -----------------------------------------------------------------------------
|
||||
self.add_ram('main_ram', origin=self.mem_map['main_ram'], size=ddrSize)
|
||||
|
||||
# Leds -------------------------------------------------------------------------------------
|
||||
self.submodules.leds = LedChaser(
|
||||
pads = platform.request_all('user_led'),
|
||||
sys_clk_freq = sys_clk_freq
|
||||
)
|
||||
self.add_csr('leds')
|
||||
|
||||
# Buttons
|
||||
self.submodules.buttons = GPIOIn(
|
||||
pads = platform.request_all('user_btn')
|
||||
)
|
||||
self.add_csr('buttons')
|
||||
|
||||
# Analyzer ---------------------------------------------------------------------------------
|
||||
if with_analyzer:
|
||||
analyzer_signals = [
|
||||
self.cpu.wb_stb,
|
||||
self.cpu.wb_cyc,
|
||||
self.cpu.wb_adr,
|
||||
self.cpu.wb_we,
|
||||
self.cpu.wb_ack,
|
||||
self.cpu.wb_sel,
|
||||
self.cpu.wb_datw,
|
||||
self.cpu.wb.datr,
|
||||
]
|
||||
self.submodules.analyzer = LiteScopeAnalyzer(analyzer_signals,
|
||||
depth = 512,
|
||||
clock_domain = 'sys',
|
||||
csr_csv = 'analyzer.csv')
|
||||
self.add_csr('analyzer')
|
||||
|
||||
|
||||
|
||||
# Build --------------------------------------------------------------------------------------------
|
||||
|
||||
def main():
|
||||
|
||||
parser = argparse.ArgumentParser(description='A2O Test')
|
||||
parser.add_argument('--build', action='store_true', help='Build bitstream')
|
||||
parser.add_argument('--load', action='store_true', help='Load bitstream')
|
||||
parser.add_argument('--sys-clk-freq', default=100e6, help='System clock frequency (default: 100MHz)')
|
||||
parser.add_argument('--with-analyzer', action='store_true', help='Include analyzer')
|
||||
|
||||
builder_args(parser)
|
||||
args = parser.parse_args()
|
||||
|
||||
soc = BaseSoC(
|
||||
sys_clk_freq = int(float(args.sys_clk_freq)),
|
||||
with_analyzer = args.with_analyzer,
|
||||
)
|
||||
|
||||
builder = Builder(soc, **builder_argdict(args))
|
||||
builder.build(run=args.build)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1 @@
|
||||
from .core import A2P
|
@ -0,0 +1,50 @@
|
||||
.section .text, "ax", @progbits
|
||||
# called by bios boot commands to do the jump to code (r1,r2,r3 can be specified in terminal 'boot' command)
|
||||
|
||||
.include "defines.s"
|
||||
|
||||
.global boot_helper
|
||||
# extern void boot_helper(unsigned long r1, unsigned long r2, unsigned long r3, unsigned long addr);
|
||||
|
||||
.align 4
|
||||
boot_helper:
|
||||
lis r3,_fstack@h
|
||||
ori r3,r3,_fstack@l # top o mem
|
||||
mtctr r6
|
||||
bctr # jump to callee
|
||||
|
||||
# play with stack. what could go wrong?
|
||||
# r1 = new top
|
||||
# orig lr 20(r1)
|
||||
# ancient r1 16(r1)
|
||||
# local1 12(r1)
|
||||
# local2 8(r1)
|
||||
# (next lr) 4(r1)
|
||||
# orig r1 0(r1)
|
||||
# doesnt help...getting a bad op, probably blr to wrong address off stack, within calls to do a putchar
|
||||
stwu r1,-32(r1)
|
||||
mflr r0
|
||||
stw r0,36(r1)
|
||||
stw r3,8(r1)
|
||||
stw r4,12(r1)
|
||||
stw r5,16(r1)
|
||||
stw r6,20(r1)
|
||||
li r3,'w'
|
||||
slwi r3,r3,8
|
||||
ori r3,r3,'t'
|
||||
slwi r3,r3,8
|
||||
ori r3,r3,'f'
|
||||
slwi r3,r3,8
|
||||
ori r3,r3,'!'
|
||||
stw r3,24(r1)
|
||||
stw r3,28(r1)
|
||||
lwz r0,36(r1)
|
||||
mtlr r6
|
||||
addi r1,r1,32
|
||||
blr
|
||||
|
||||
#addi r1,r1,32 # leave frame on stack
|
||||
#mtctr r6
|
||||
#bctrl # jump to callee
|
||||
|
||||
b .
|
@ -0,0 +1,150 @@
|
||||
#
|
||||
|
||||
import os
|
||||
|
||||
from migen import *
|
||||
|
||||
from litex import get_data_mod
|
||||
from litex.soc.interconnect import wishbone
|
||||
from litex.soc.interconnect.csr import *
|
||||
from litex.soc.cores.cpu import CPU
|
||||
|
||||
dir = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
# these select the top RTL file for each variant name
|
||||
CPU_VARIANTS = {
|
||||
'WB': 'A2P',
|
||||
'standard': 'A2P' #wtf litex does this as default
|
||||
}
|
||||
|
||||
GCC_FLAGS = {
|
||||
'WB' : '-m32 -mbig-endian -mno-multiple -msoft-float -fno-stack-protector -Xassembler -defsym -Xassembler BIOS_32=1'
|
||||
}
|
||||
|
||||
class A2P(CPU, AutoCSR):
|
||||
name = 'a2p'
|
||||
human_name = 'a2p'
|
||||
variants = CPU_VARIANTS
|
||||
|
||||
family = 'powerpc'
|
||||
data_width = 32
|
||||
endianness = 'big'
|
||||
gcc_triple = 'powerpc-linux-gnu'
|
||||
linker_output_format = 'elf32-powerpc'
|
||||
|
||||
nop = 'nop'
|
||||
io_regions = {0x80000000: 0x80000000} # origin, length
|
||||
|
||||
@property
|
||||
def mem_map(self):
|
||||
return {
|
||||
'rom': 0x00000000,
|
||||
'sram': 0x00004000,
|
||||
'main_ram': 0x40000000,
|
||||
'csr': 0xf0000000,
|
||||
}
|
||||
|
||||
@property
|
||||
def gcc_flags(self):
|
||||
flags = GCC_FLAGS[self.variant]
|
||||
flags += ' -D__a2p__'
|
||||
flags += ' -DCONFIG_BIOS_NO_BOOT=1 -DCONFIG_BIOS_NO_CRC=1 -DCONFIG_MAIN_RAM_INIT=1' #wtf skip crc and ram memtest for now!
|
||||
return flags
|
||||
|
||||
def __init__(self, platform, variant='WB'):
|
||||
|
||||
if variant == 'standard':
|
||||
variant = 'WB'
|
||||
|
||||
self.platform = platform
|
||||
self.variant = variant
|
||||
self.human_name = 'a2p'
|
||||
self.external_variant = None
|
||||
self.reset = Signal()
|
||||
self.interrupt = Signal(32)
|
||||
self.interruptS = Signal()
|
||||
self.ibus = ibus = wishbone.Interface()
|
||||
self.dbus = dbus = wishbone.Interface()
|
||||
self.periph_buses = [ibus, dbus]
|
||||
self.memory_buses = []
|
||||
self.enableDebug = False
|
||||
self.enableJTAG = False
|
||||
self.externalResetVector = 0
|
||||
|
||||
# # #
|
||||
|
||||
self.cpu_params = dict(
|
||||
i_clk = ClockSignal(),
|
||||
i_reset = ResetSignal() | self.reset,
|
||||
|
||||
i_externalInterrupt = self.interrupt[0],
|
||||
i_externalInterruptS = self.interruptS,
|
||||
i_timerInterrupt = 0,
|
||||
i_softwareInterrupt = 0,
|
||||
|
||||
#wtf i guess you get these names from the Inteface() def - but what about other sigs?
|
||||
o_iBusWB_ADR = ibus.adr,
|
||||
o_iBusWB_DAT_MOSI = ibus.dat_w,
|
||||
o_iBusWB_SEL = ibus.sel,
|
||||
o_iBusWB_CYC = ibus.cyc,
|
||||
o_iBusWB_STB = ibus.stb,
|
||||
o_iBusWB_WE = ibus.we,
|
||||
o_iBusWB_CTI = ibus.cti,
|
||||
o_iBusWB_BTE = ibus.bte,
|
||||
i_iBusWB_DAT_MISO = ibus.dat_r,
|
||||
i_iBusWB_ACK = ibus.ack,
|
||||
i_iBusWB_ERR = ibus.err,
|
||||
|
||||
o_dBusWB_ADR = dbus.adr,
|
||||
o_dBusWB_DAT_MOSI = dbus.dat_w,
|
||||
o_dBusWB_SEL = dbus.sel,
|
||||
o_dBusWB_CYC = dbus.cyc,
|
||||
o_dBusWB_STB = dbus.stb,
|
||||
o_dBusWB_WE = dbus.we,
|
||||
o_dBusWB_CTI = dbus.cti,
|
||||
o_dBusWB_BTE = dbus.bte,
|
||||
i_dBusWB_DAT_MISO = dbus.dat_r,
|
||||
i_dBusWB_ACK = dbus.ack,
|
||||
i_dBusWB_ERR = dbus.err
|
||||
)
|
||||
|
||||
self.cpu_params['i_externalResetVector'] = self.externalResetVector
|
||||
|
||||
# these need to connect to top nets
|
||||
if self.enableDebug:
|
||||
self.cpu_params['i_debugReset'] = 0
|
||||
self.cpu_params['o_debug_resetOut'] = 0
|
||||
self.cpu_params['i_debug_bus_cmd_valid'] = 0
|
||||
self.cpu_params['i_debug_bus_cmd_ready'] = 0
|
||||
self.cpu_params['i_debug_bus_cmd_payload_wr'] = 0
|
||||
self.cpu_params['i_debug_bus_cmd_payload_address'] = 0
|
||||
self.cpu_params['i_debug_bus_cmd_payload_data'] = 0
|
||||
self.cpu_params['o_debug_bus_rsp_data'] = 0
|
||||
|
||||
if self.enableJTAG:
|
||||
self.cpu_params['i_jtag_tms'] = 0
|
||||
self.cpu_params['i_jtag_tck'] = 0
|
||||
self.cpu_params['i_jtag_tdi'] = 0
|
||||
self.cpu_params['o_jtag_tdo'] = 0
|
||||
|
||||
def set_reset_address(self, reset_address):
|
||||
assert not hasattr(self, 'reset_address')
|
||||
self.reset_address = reset_address
|
||||
self.cpu_params.update(i_externalResetVector=Signal(32, reset=reset_address))
|
||||
|
||||
@staticmethod
|
||||
def add_sources(platform, variant='WB'):
|
||||
cpu_filename = CPU_VARIANTS[variant] + '.v'
|
||||
#vdir = get_data_mod('cpu', 'a2p').data_location
|
||||
vdir = os.path.join(dir, 'verilog')
|
||||
platform.add_source(os.path.join(vdir, cpu_filename))
|
||||
|
||||
def use_external_variant(self, variant_filename):
|
||||
self.external_variant = True
|
||||
self.platform.add_source(variant_filename)
|
||||
|
||||
def do_finalize(self):
|
||||
assert hasattr(self, 'reset_address')
|
||||
if not self.external_variant:
|
||||
self.add_sources(self.platform, self.variant)
|
||||
self.specials += Instance('A2P', **self.cpu_params)
|
@ -0,0 +1,261 @@
|
||||
.include "defines.s"
|
||||
|
||||
.set DEBUG,1
|
||||
|
||||
.macro load32 rx,v
|
||||
li \rx,0
|
||||
oris \rx,\rx,\v>>16
|
||||
ori \rx,\rx,\v&0x0000FFFF
|
||||
.endm
|
||||
|
||||
.macro load16swiz rx,v
|
||||
li \rx,0
|
||||
ori \rx,\rx,(\v<<8)&0xFF00
|
||||
ori \rx,\rx,(\v>>8)&0x00FF
|
||||
.endm
|
||||
|
||||
.macro delayr rx
|
||||
mtctr \rx
|
||||
bdnz .
|
||||
.endm
|
||||
|
||||
.macro delay rx,v
|
||||
li \rx,0
|
||||
oris \rx,\rx,\v>>16
|
||||
ori \rx,\rx,\v&0x0000FFFF
|
||||
mtctr \rx
|
||||
bdnz .
|
||||
.endm
|
||||
|
||||
.section .text
|
||||
|
||||
.global _start
|
||||
|
||||
.org 0x0000
|
||||
|
||||
_start:
|
||||
b boot_start
|
||||
|
||||
.set REGSAVE,0x04
|
||||
regsave:
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
.long 0
|
||||
|
||||
.org 0x0100
|
||||
int_100:
|
||||
b .
|
||||
|
||||
# mck
|
||||
.align 8
|
||||
int_200:
|
||||
b .
|
||||
|
||||
# dsi
|
||||
.align 8
|
||||
int_300:
|
||||
b .
|
||||
|
||||
# dseg
|
||||
.align 7
|
||||
int_380:
|
||||
b .
|
||||
|
||||
# isi
|
||||
.align 8
|
||||
int_400:
|
||||
b .
|
||||
|
||||
# iseg
|
||||
.align 7
|
||||
int_480:
|
||||
b .
|
||||
|
||||
.ifndef DEBUG
|
||||
# external
|
||||
.align 8
|
||||
int_500:
|
||||
b .
|
||||
|
||||
# alignment
|
||||
.align 8
|
||||
int_600:
|
||||
b .
|
||||
|
||||
# program
|
||||
.align 8
|
||||
int_700:
|
||||
b .
|
||||
|
||||
# fp unavailable
|
||||
.align 8
|
||||
int_800:
|
||||
b .
|
||||
|
||||
# dec
|
||||
.align 8
|
||||
int_900:
|
||||
b .
|
||||
|
||||
# dec hyp
|
||||
.align 7
|
||||
int_980:
|
||||
b .
|
||||
|
||||
# doorbell
|
||||
.align 8
|
||||
int_C00:
|
||||
b .
|
||||
|
||||
# trace
|
||||
.align 8
|
||||
int_D00:
|
||||
b .
|
||||
|
||||
# dsi hyp
|
||||
.align 8
|
||||
int_E00:
|
||||
b .
|
||||
|
||||
# isi hyp
|
||||
.align 5
|
||||
int_E20:
|
||||
b .
|
||||
|
||||
# emulation hyp
|
||||
.align 5
|
||||
int_E40:
|
||||
b .
|
||||
|
||||
# maintenance hyp
|
||||
.align 5
|
||||
int_E60:
|
||||
b .
|
||||
|
||||
# doorbell hyp
|
||||
.align 5
|
||||
int_E80:
|
||||
b .
|
||||
|
||||
# virtualization hyp
|
||||
.align 5
|
||||
int_EA0:
|
||||
b .
|
||||
|
||||
# reserved
|
||||
.align 5
|
||||
int_EC0:
|
||||
b .
|
||||
|
||||
# reserved
|
||||
.align 5
|
||||
int_EE0:
|
||||
b .
|
||||
|
||||
# perfmon
|
||||
.align 5
|
||||
int_F00:
|
||||
b .
|
||||
|
||||
# vector unavailable
|
||||
.align 5
|
||||
int_F20:
|
||||
b .
|
||||
|
||||
# vsx unavailable
|
||||
.align 5
|
||||
int_F40:
|
||||
b .
|
||||
|
||||
# facility unavailable
|
||||
.align 5
|
||||
int_F60:
|
||||
b .
|
||||
|
||||
# facility unavailable hyp
|
||||
.align 5
|
||||
int_F80:
|
||||
b .
|
||||
|
||||
.endif
|
||||
|
||||
# ------------------------------------------------------------------------------------------------------------------------------
|
||||
# init facilities and memories before blastoff
|
||||
#
|
||||
|
||||
.ifdef DEBUG
|
||||
.org 0x4E4 # match up close to a2o version
|
||||
.else
|
||||
.org 0x1000
|
||||
.endif
|
||||
|
||||
boot_start:
|
||||
|
||||
rominit:
|
||||
|
||||
########################################################################################################################################
|
||||
# VMA/LMA: copy .data, clear .bss
|
||||
|
||||
# get the linker script symbols needed...
|
||||
lis r1,_fdata_rom@h
|
||||
ori r1,r1,_fdata_rom@l
|
||||
lis r2,_fdata@h
|
||||
ori r2,r2,_fdata@l
|
||||
lis r3,_edata_rom@h
|
||||
ori r3,r3,_edata_rom@l
|
||||
lis r4,_fbss@h
|
||||
ori r4,r4,_fbss@l
|
||||
lis r5,_ebss@h
|
||||
ori r5,r5,_ebss@l
|
||||
|
||||
subf r9,r1,r3
|
||||
srwi. r9,r9,2
|
||||
beq romcopy_done
|
||||
mtctr r9
|
||||
addi r1,r1,-4
|
||||
addi r2,r2,-4
|
||||
|
||||
romcopy:
|
||||
lwzu r9,4(r1)
|
||||
stwu r9,4(r2)
|
||||
bdnz romcopy
|
||||
|
||||
romcopy_done:
|
||||
subf r9,r4,r5
|
||||
srwi. r9,r9,2
|
||||
beq romclear_done
|
||||
|
||||
mtctr r9
|
||||
addi r4,r4,-4
|
||||
li r9,0
|
||||
|
||||
romclear:
|
||||
stwu r9,4(r4)
|
||||
bdnz romclear
|
||||
|
||||
romclear_done:
|
||||
|
||||
########################################################################################################################################
|
||||
|
||||
########################################################################################################################################
|
||||
|
||||
process_start:
|
||||
|
||||
jump2main:
|
||||
lis r1,_fstack@h
|
||||
ori r1,r1,_fstack@l
|
||||
addi r1,r1,-16
|
||||
li r3, 0 # parm 1
|
||||
b main
|
||||
|
||||
|
||||
.align 4
|
||||
.ifdef BIOS_32
|
||||
.include "crtsavres.s"
|
||||
.endif
|
||||
|
@ -0,0 +1,129 @@
|
||||
# save/restore for 32b libc
|
||||
|
||||
.macro GLOBAL n
|
||||
.type \n,@function
|
||||
.global \n
|
||||
\n:
|
||||
.endm
|
||||
|
||||
# saves
|
||||
|
||||
GLOBAL _savegpr_16
|
||||
stw 16,-64(11)
|
||||
|
||||
GLOBAL _savegpr_17
|
||||
stw 17,-60(11)
|
||||
|
||||
GLOBAL _savegpr_18
|
||||
stw 18,-56(11)
|
||||
|
||||
GLOBAL _savegpr_19
|
||||
stw 19,-52(11)
|
||||
|
||||
GLOBAL _savegpr_20
|
||||
stw 20,-48(11)
|
||||
|
||||
GLOBAL _savegpr_21
|
||||
stw 21,-44(11)
|
||||
|
||||
GLOBAL _savegpr_22
|
||||
stw 22,-40(11)
|
||||
|
||||
GLOBAL _savegpr_23
|
||||
stw 23,-36(11)
|
||||
|
||||
GLOBAL _savegpr_24
|
||||
stw 24,-32(11)
|
||||
|
||||
GLOBAL _savegpr_25
|
||||
stw 25,-28(11)
|
||||
|
||||
GLOBAL _savegpr_26
|
||||
stw 26,-24(11)
|
||||
|
||||
GLOBAL _savegpr_27
|
||||
stw 27,-20(11)
|
||||
|
||||
GLOBAL _savegpr_28
|
||||
stw 28,-16(11)
|
||||
|
||||
GLOBAL _savegpr_29
|
||||
stw 29,-12(11)
|
||||
|
||||
GLOBAL _savegpr_30
|
||||
stw 30,-8(11)
|
||||
|
||||
GLOBAL _savegpr_31
|
||||
stw 31,-4(11)
|
||||
blr
|
||||
|
||||
# restores
|
||||
|
||||
GLOBAL _restgpr_16_x
|
||||
GLOBAL _rest32gpr_16_x
|
||||
lwz 16,-64(11)
|
||||
|
||||
GLOBAL _restgpr_17_x
|
||||
GLOBAL _rest32gpr_17_x
|
||||
lwz 17,-60(11)
|
||||
|
||||
GLOBAL _restgpr_18_x
|
||||
GLOBAL _rest32gpr_18_x
|
||||
lwz 18,-56(11)
|
||||
|
||||
GLOBAL _restgpr_19_x
|
||||
GLOBAL _rest32gpr_19_x
|
||||
lwz 19,-52(11)
|
||||
|
||||
GLOBAL _restgpr_20_x
|
||||
GLOBAL _rest32gpr_20_x
|
||||
lwz 20,-48(11)
|
||||
|
||||
GLOBAL _restgpr_21_x
|
||||
GLOBAL _rest32gpr_21_x
|
||||
lwz 21,-44(11)
|
||||
|
||||
GLOBAL _restgpr_22_x
|
||||
GLOBAL _rest32gpr_22_x
|
||||
lwz 22,-40(11)
|
||||
|
||||
GLOBAL _restgpr_23_x
|
||||
GLOBAL _rest32gpr_23_x
|
||||
lwz 23,-36(11)
|
||||
|
||||
GLOBAL _restgpr_24_x
|
||||
GLOBAL _rest32gpr_24_x
|
||||
lwz 24,-32(11)
|
||||
|
||||
GLOBAL _restgpr_25_x
|
||||
GLOBAL _rest32gpr_25_x
|
||||
lwz 25,-28(11)
|
||||
|
||||
GLOBAL _restgpr_26_x
|
||||
GLOBAL _rest32gpr_26_x
|
||||
lwz 26,-24(11)
|
||||
|
||||
GLOBAL _restgpr_27_x
|
||||
GLOBAL _rest32gpr_27_x
|
||||
lwz 27,-20(11)
|
||||
|
||||
GLOBAL _restgpr_28_x
|
||||
GLOBAL _rest32gpr_28_x
|
||||
lwz 28,-16(11)
|
||||
|
||||
GLOBAL _restgpr_29_x
|
||||
GLOBAL _rest32gpr_29_x
|
||||
lwz 29,-12(11)
|
||||
|
||||
GLOBAL _restgpr_30_x
|
||||
GLOBAL _rest32gpr_30_x
|
||||
lwz 30,-8(11)
|
||||
|
||||
GLOBAL _restgpr_31_x
|
||||
GLOBAL _rest32gpr_31_x
|
||||
lwz 0,4(11)
|
||||
lwz 31,-4(11)
|
||||
mtlr 0
|
||||
mr 1,11
|
||||
blr
|
||||
|
@ -0,0 +1,146 @@
|
||||
# © IBM Corp. 2020
|
||||
# Licensed under and subject to the terms of the CC-BY 4.0
|
||||
# license (https://creativecommons.org/licenses/by/4.0/legalcode).
|
||||
# Additional rights, including the right to physically implement a softcore
|
||||
# that is compliant with the required sections of the Power ISA
|
||||
# Specification, will be available at no cost via the OpenPOWER Foundation.
|
||||
# This README will be updated with additional information when OpenPOWER's
|
||||
# license is available.
|
||||
|
||||
#-----------------------------------------
|
||||
# Defines
|
||||
#-----------------------------------------
|
||||
|
||||
# Regs
|
||||
|
||||
.set r0, 0
|
||||
.set r1, 1
|
||||
.set r2, 2
|
||||
.set r3, 3
|
||||
.set r4, 4
|
||||
.set r5, 5
|
||||
.set r6, 6
|
||||
.set r7, 7
|
||||
.set r8, 8
|
||||
.set r9, 9
|
||||
.set r10,10
|
||||
.set r11,11
|
||||
.set r12,12
|
||||
.set r13,13
|
||||
.set r14,14
|
||||
.set r15,15
|
||||
.set r16,16
|
||||
.set r17,17
|
||||
.set r18,18
|
||||
.set r19,19
|
||||
.set r20,20
|
||||
.set r21,21
|
||||
.set r22,22
|
||||
.set r23,23
|
||||
.set r24,24
|
||||
.set r25,25
|
||||
.set r26,26
|
||||
.set r27,27
|
||||
.set r28,28
|
||||
.set r29,29
|
||||
.set r30,30
|
||||
.set r31,31
|
||||
|
||||
.set f0, 0
|
||||
.set f1, 1
|
||||
.set f2, 2
|
||||
.set f3, 3
|
||||
.set f4, 4
|
||||
.set f5, 5
|
||||
.set f6, 6
|
||||
.set f7, 7
|
||||
.set f8, 8
|
||||
.set f9, 9
|
||||
.set f10,10
|
||||
.set f11,11
|
||||
.set f12,12
|
||||
.set f13,13
|
||||
.set f14,14
|
||||
.set f15,15
|
||||
.set f16,16
|
||||
.set f17,17
|
||||
.set f18,18
|
||||
.set f19,19
|
||||
.set f20,20
|
||||
.set f21,21
|
||||
.set f22,22
|
||||
.set f23,23
|
||||
.set f24,24
|
||||
.set f25,25
|
||||
.set f26,26
|
||||
.set f27,27
|
||||
.set f28,28
|
||||
.set f29,29
|
||||
.set f30,30
|
||||
.set f31,31
|
||||
|
||||
.set cr0, 0
|
||||
.set cr1, 1
|
||||
.set cr2, 2
|
||||
.set cr3, 3
|
||||
.set cr4, 4
|
||||
.set cr5, 5
|
||||
.set cr6, 6
|
||||
.set cr7, 7
|
||||
|
||||
# SPR numbers
|
||||
|
||||
.set srr0, 26
|
||||
.set srr1, 27
|
||||
.set epcr, 307
|
||||
.set tar, 815
|
||||
.set dsisr, 18
|
||||
.set dar, 19
|
||||
|
||||
.set dbsr, 304
|
||||
.set dbcr0, 308
|
||||
.set dbcr1, 309
|
||||
.set dbcr2, 310
|
||||
.set dbcr3, 848
|
||||
|
||||
.set ivpr, 63
|
||||
|
||||
.set iucr0, 1011
|
||||
.set iucr1, 883
|
||||
.set iucr2, 884
|
||||
|
||||
.set iudbg0, 888
|
||||
.set iudbg1, 889
|
||||
.set iudbg2, 890
|
||||
.set iulfsr, 891
|
||||
.set iullcr, 892
|
||||
|
||||
.set mmucr0, 1020
|
||||
.set mmucr1, 1021
|
||||
.set mmucr2, 1022
|
||||
.set mmucr3, 1023
|
||||
|
||||
.set tb, 268
|
||||
.set tbl, 284
|
||||
.set tbh, 285
|
||||
|
||||
.set dec, 22
|
||||
.set udec, 550
|
||||
.set tsr, 336
|
||||
.set tcr, 340
|
||||
|
||||
.set xucr0, 1014
|
||||
.set xucr1, 851
|
||||
.set xucr2, 1016
|
||||
.set xucr3, 852
|
||||
.set xucr4, 853
|
||||
|
||||
.set tens, 438
|
||||
.set tenc, 439
|
||||
.set tensr, 437
|
||||
|
||||
.set pid, 48
|
||||
.set pir, 286
|
||||
.set pvr, 287
|
||||
.set tir, 446
|
||||
|
@ -0,0 +1,18 @@
|
||||
#ifndef __IRQ_H
|
||||
#define __IRQ_H
|
||||
|
||||
static inline void irq_setmask(unsigned int mask) {
|
||||
}
|
||||
|
||||
static inline unsigned int irq_getmask(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline unsigned int irq_pending(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void irq_setie(unsigned int mask) {
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,67 @@
|
||||
// a2p
|
||||
// changed to NOT
|
||||
|
||||
#ifndef __SYSTEM_H
|
||||
#define __SYSTEM_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
void flush_l2_cache(void) {
|
||||
}
|
||||
*/
|
||||
static void flush_cpu_icache(void);
|
||||
static void flush_cpu_dcache(void);
|
||||
|
||||
static void flush_cpu_icache(void) {
|
||||
}
|
||||
static void flush_cpu_dcache(void) {
|
||||
}
|
||||
|
||||
|
||||
/* CSRs are stored in subregister slices of CONFIG_CSR_DATA_WIDTH (native
|
||||
* endianness), with the least significant slice at the lowest aligned
|
||||
* (base) address. */
|
||||
|
||||
/* CSR subregisters (a.k.a. "simple CSRs") are embedded inside uint32_t
|
||||
* aligned locations: */
|
||||
|
||||
/*
|
||||
#define CSR_ACCESSORS_DEFINED
|
||||
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
#define MMPTR(x) x
|
||||
#else
|
||||
|
||||
#include <generated/soc.h>
|
||||
#if !defined(CONFIG_CSR_DATA_WIDTH)
|
||||
#error CSR_DATA_WIDTH MUST be set before including this file!
|
||||
#endif
|
||||
|
||||
#define MMPTR(a) (*((volatile uint32_t *)(a)))
|
||||
|
||||
static inline unsigned long swizzle(unsigned long v);
|
||||
|
||||
static inline unsigned long swizzle(unsigned long v) {
|
||||
//return ((v & 0x000000FF) << 24) | ((v & 0x0000FF00) << 8) | ((v & 0x00FF0000) >> 8) | ((v & 0xFF000000) >> 24);
|
||||
return v;
|
||||
}
|
||||
|
||||
static inline void csr_write_simple(unsigned long v, unsigned long a)
|
||||
{
|
||||
//MMPTR(a) = v;
|
||||
MMPTR(a) = swizzle(v);
|
||||
}
|
||||
|
||||
static inline unsigned long csr_read_simple(unsigned long a)
|
||||
{
|
||||
//return MMPTR(a);
|
||||
return swizzle(MMPTR(a));
|
||||
}
|
||||
|
||||
#endif
|
||||
*/
|
||||
|
||||
#endif /* __SYSTEM_H */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
# read .bin (objcopy -O binary x.elf x.bin) and create ascii block file
|
||||
|
||||
import sys
|
||||
from binascii import hexlify, unhexlify
|
||||
|
||||
def x2d(i):
|
||||
return int(i, 16)
|
||||
|
||||
inFile = sys.argv[1]
|
||||
#size = sys.argv[2]
|
||||
|
||||
outFile = inFile + '.hex'
|
||||
|
||||
lines = []
|
||||
with open(inFile, 'rb') as binFile:
|
||||
word = binFile.read(4)
|
||||
while word:
|
||||
hex = hexlify(word)
|
||||
lines.append(hex.decode('utf-8').upper() + '\n')
|
||||
word = binFile.read(4)
|
||||
|
||||
# need to pad to full size?
|
||||
with open(outFile, 'w') as txtFile:
|
||||
txtFile.writelines(lines)
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,52 @@
|
||||
# Testing full Litex software build
|
||||
|
||||
* manually update/install litex picolib for 32BE
|
||||
|
||||
* fixes for BE in A2P_4K1W.v
|
||||
|
||||
* cp A2P_4K1W.v A2P_WB.v
|
||||
and edit to rename to module A2P_WB
|
||||
|
||||
```
|
||||
cd ../../build/litex
|
||||
a2p_a2o_32.py --csr-csv csr.csv
|
||||
powerpc-linux-gnu-objdump -d build/cmod7/software/bios/bios.elf > bios.d
|
||||
powerpc-linux-gnu-objdump -s build/cmod7/software/bios/bios.elf > bios.s
|
||||
bin2init build/cmod7/software/bios/bios.bin
|
||||
|
||||
#if rtl updated
|
||||
#cp a2p/verilog/A2P_WB.v ../../../sim/soc/.
|
||||
#cp build/cmod7/gateware/cmod.v ../../../sim/soc/soc.v
|
||||
#sed -i "s/module cmod7/module soc/" soc.v # keep consistent naming for top
|
||||
|
||||
cp bios.d ../../../sim/soc/.
|
||||
cp bios.s ../../../sim/soc/.
|
||||
cp build/cmod7/software/bios/bios.bin.hex ../../../sim/soc/cmod7_rom.init
|
||||
|
||||
|
||||
cd ../../../sim/soc
|
||||
top=cmod7
|
||||
mod=soc
|
||||
#if rtl updated
|
||||
#sed -i "s/module $top/module $mod/" $mod.v # keep consistent naming for top
|
||||
|
||||
###############################################
|
||||
# build with or without tracing ###############
|
||||
|
||||
dir=obj_dir_${mod}
|
||||
verilator -cc --exe --CFLAGS -DUART=2593 --trace --Mdir $dir --language 1364-2001 -Wno-fatal -Wno-LITENDIAN --error-limit 1 -Iunisims soc $mod tb_litex_$mod.cpp |& tee verilator_$mod.txt
|
||||
make -j6 -C $dir -f V$mod.mk V$mod
|
||||
$dir/V$mod | tee sim_soc.txt
|
||||
|
||||
dir=obj_dir_${mod}_notrace
|
||||
verilator -cc --exe --CFLAGS -DUART=2593 --CFLAGS -DNO_TRACE=1 --Mdir $dir --language 1364-2001 -Wno-fatal -Wno-LITENDIAN --error-limit 1 -Iunisims soc $mod tb_litex_$mod.cpp |& tee verilator_$mod.txt
|
||||
make -j6 -C $dir -f V$mod.mk V$mod
|
||||
$dir/V$mod
|
||||
|
||||
################################################
|
||||
|
||||
|
||||
vcd2fst a2plitex.vcd soc.fst
|
||||
rm a2p_soc.vcd
|
||||
gtkwave soc.fst soc.gtkw
|
||||
```
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,455 @@
|
||||
// simple verilator top
|
||||
// litex soc w/a2p
|
||||
|
||||
#ifndef NO_TRACE
|
||||
#define TRACING
|
||||
#endif
|
||||
|
||||
// old public access method
|
||||
//#define OLD_PUBLIC
|
||||
|
||||
#include <cstddef>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <unordered_map>
|
||||
|
||||
#include "verilated.h"
|
||||
#include "Vsoc.h"
|
||||
|
||||
#ifndef OLD_PUBLIC
|
||||
// internal nets
|
||||
#include "Vsoc___024root.h"
|
||||
#endif
|
||||
|
||||
#include "Vsoc_soc.h"
|
||||
#include "Vsoc_A2P_WB.h"
|
||||
|
||||
#ifdef TRACING
|
||||
#include "verilated_vcd_c.h"
|
||||
VerilatedVcdC *t;
|
||||
#else
|
||||
unsigned int t = 0;
|
||||
#endif
|
||||
|
||||
// using https://github.com/ZipCPU/wbuart32 sim driver
|
||||
// how does cpp get compiled in without this? can verilator be told to add more cpp? see a2p!
|
||||
// UART=port
|
||||
// 0xA20 = 2592
|
||||
// A2P = 2593
|
||||
#ifdef UART
|
||||
#include "wbuart32/bench/cpp/uartsim.h"
|
||||
#include "wbuart32/bench/cpp/uartsim.cpp"
|
||||
#endif
|
||||
|
||||
Vsoc* m;
|
||||
#ifdef OLD_PUBLIC
|
||||
Vsoc* root;
|
||||
#else
|
||||
Vsoc___024root* root;
|
||||
#endif
|
||||
|
||||
vluint64_t main_time = 0; // in units of timeprecision used in verilog or --timescale-override
|
||||
|
||||
double sc_time_stamp() { // $time in verilog
|
||||
return main_time;
|
||||
}
|
||||
|
||||
const char* tbName = "tb_litex_soc";
|
||||
const int resetCycle = 10;
|
||||
const int threadRunCycle = resetCycle + 5;
|
||||
const int runCycles = 1000000000;
|
||||
const int hbCycles = 500;
|
||||
const int quiesceCycles = 50;
|
||||
const int threads = 1;
|
||||
const std::string testFile = "";
|
||||
const unsigned int bootAdr = 0x00000000;
|
||||
const bool failMaxCycles = true;
|
||||
const unsigned int stopOnHang = 500;
|
||||
const unsigned int stopOnLoop = 20;
|
||||
const unsigned long iarPass = 0x7F0;
|
||||
const unsigned long iarFail = 0x7F4;
|
||||
const bool debugWB = true;
|
||||
const bool debugWBReq = false;
|
||||
|
||||
// Cythonize this and use it for cocotb too...
|
||||
|
||||
class Memory {
|
||||
std::unordered_map<unsigned int, unsigned int> mem;
|
||||
public:
|
||||
bool le;
|
||||
bool logStores;
|
||||
int defaultVal;
|
||||
Memory();
|
||||
void loadFile(std::string filename, unsigned int adr=0, bool le=false, std::string format="ascii");
|
||||
int read(unsigned int adr);
|
||||
void write(unsigned int adr, unsigned int dat);
|
||||
void write(unsigned int adr, unsigned int be, unsigned int dat);
|
||||
};
|
||||
|
||||
Memory::Memory() {
|
||||
|
||||
this->defaultVal = 0;
|
||||
this->le = false;
|
||||
this->logStores = true;
|
||||
|
||||
}
|
||||
|
||||
void Memory::loadFile(std::string filename, unsigned int adr, bool le, std::string format) {
|
||||
|
||||
unsigned int dat;
|
||||
std::ifstream f;
|
||||
f.open(filename, std::fstream::in);
|
||||
// "ascii"
|
||||
//while (f.peek()!=EOF) {
|
||||
//f >> std::hex >> dat;
|
||||
// f >> dat;
|
||||
while (f >> std::hex >> dat) {
|
||||
this->write(adr, dat);
|
||||
adr += 4;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// adr is word-aligned byte address
|
||||
int Memory::read(unsigned int adr) {
|
||||
if (this->mem.find(adr) != this->mem.end()) {
|
||||
return this->mem[adr];
|
||||
} else {
|
||||
return this->defaultVal;
|
||||
}
|
||||
}
|
||||
|
||||
// adr is word-aligned byte address
|
||||
void Memory::write(unsigned int adr, unsigned int dat) {
|
||||
unsigned int startDat = this->read(adr);
|
||||
this->write(adr, 0xF, dat);
|
||||
}
|
||||
|
||||
void Memory::write(unsigned int adr, unsigned int be, unsigned int dat) {
|
||||
if (be == 0) return;
|
||||
|
||||
int mask = 0, startDat;
|
||||
if (be >= 8) {
|
||||
be = be - 8;
|
||||
mask = 0xFF000000;
|
||||
} else {
|
||||
mask = 0;
|
||||
}
|
||||
if (be >= 4) {
|
||||
be = be - 4;
|
||||
mask |= 0x00FF0000;
|
||||
}
|
||||
if (be >= 2) {
|
||||
be = be - 2;
|
||||
mask |= 0x0000FF00;
|
||||
}
|
||||
if (be = 1) {
|
||||
mask |= 0x000000FF;
|
||||
}
|
||||
|
||||
startDat = this->read(adr);
|
||||
this->mem[adr] = (startDat & ~mask) | (dat & mask);
|
||||
if (this->logStores) {
|
||||
std::cout << " * Mem Update @" << std::setw(8) << std::setfill('0') << std::uppercase << std::hex << adr <<
|
||||
" " <<std::setw(8) << std::setfill('0') << std::uppercase << std::hex << startDat <<
|
||||
"->" <<std::setw(8) << std::setfill('0') << std::uppercase << std::hex << this->read(adr) << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
Memory mem;
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
using namespace std;
|
||||
|
||||
cout << setfill('0');
|
||||
|
||||
Verilated::commandArgs(argc, argv);
|
||||
m = new Vsoc;
|
||||
#ifdef OLD_PUBLIC
|
||||
root = m;
|
||||
#else
|
||||
root = m->rootp;
|
||||
#endif
|
||||
|
||||
#ifdef TRACING
|
||||
Verilated::traceEverOn(true);
|
||||
t = new VerilatedVcdC;
|
||||
m->trace(t, 99);
|
||||
t->open("a2plitex.vcd");
|
||||
cout << "Tracing enabled." << endl;
|
||||
#endif
|
||||
|
||||
unsigned int i, v;
|
||||
bool ok = true;
|
||||
bool done = false;
|
||||
bool resetDone = false;
|
||||
bool booted = false;
|
||||
unsigned int quiesceCount = 0;
|
||||
unsigned int threadStop = 0x3;
|
||||
|
||||
unsigned int tick = 0;
|
||||
unsigned int cycle = 1;
|
||||
unsigned int readPending = 0;
|
||||
unsigned int readAddr = 0;
|
||||
unsigned int readTag = 0;
|
||||
unsigned int readTID = 0;
|
||||
unsigned int countReads = 0;
|
||||
unsigned int lastCompCycle = 0;
|
||||
unsigned int lastCompSame = 0;
|
||||
unsigned int lastCompIAR = 0x0000001;
|
||||
unsigned int gpr[32];
|
||||
bool wbRdPending = false, wbWrPending = false;
|
||||
|
||||
// memory setup
|
||||
//mem.write(0xFFFFFFFC, 0x48000002);
|
||||
//mem.loadFile(testFile);
|
||||
|
||||
// uart setup
|
||||
/*
|
||||
// i_setup[30] True if we are not using hardware flow control. This bit
|
||||
// is ignored within this module, as any receive hardware flow
|
||||
// control will need to be implemented elsewhere.
|
||||
//
|
||||
// i_setup[29:28] Indicates the number of data bits per word. This will
|
||||
// either be 2'b00 for an 8-bit word, 2'b01 for a 7-bit word, 2'b10
|
||||
// for a six bit word, or 2'b11 for a five bit word.
|
||||
//
|
||||
// i_setup[27] Indicates whether or not to use one or two stop bits.
|
||||
// Set this to one to expect two stop bits, zero for one.
|
||||
//
|
||||
// i_setup[26] Indicates whether or not a parity bit exists. Set this
|
||||
// to 1'b1 to include parity.
|
||||
//
|
||||
// i_setup[25] Indicates whether or not the parity bit is fixed. Set
|
||||
// to 1'b1 to include a fixed bit of parity, 1'b0 to allow the
|
||||
// parity to be set based upon data. (Both assume the parity
|
||||
// enable value is set.)
|
||||
//
|
||||
// i_setup[24] This bit is ignored if parity is not used. Otherwise,
|
||||
// in the case of a fixed parity bit, this bit indicates whether
|
||||
// mark (1'b1) or space (1'b0) parity is used. Likewise if the
|
||||
// parity is not fixed, a 1'b1 selects even parity, and 1'b0
|
||||
// selects odd.
|
||||
//
|
||||
// i_setup[23:0] Indicates the speed of the UART in terms of clocks.
|
||||
// So, for example, if you have a 200 MHz clock and wish to
|
||||
// run your UART at 9600 baud, you would take 200 MHz and divide
|
||||
// by 9600 to set this value to 24'd20834. Likewise if you wished
|
||||
// to run this serial port at 115200 baud from a 200 MHz clock,
|
||||
// you would set the value to 24'd1736
|
||||
*/
|
||||
/*
|
||||
m_baud_counts = (isetup & 0x0ffffff);
|
||||
m_nbits = 8-((isetup >> 28)&0x03);
|
||||
m_nstop =((isetup >> 27)&1)+1;
|
||||
m_nparity = (isetup >> 26)&1;
|
||||
m_fixdp = (isetup >> 25)&1;
|
||||
m_evenp = (isetup >> 24)&1;
|
||||
*/
|
||||
|
||||
// 100MHz, 115200 = 868
|
||||
#ifdef UART
|
||||
UARTSIM *uart;
|
||||
int uartPort = UART; // 0-stdin/stdout
|
||||
//unsigned uartConfig = 1736;
|
||||
unsigned uartConfig = 868;
|
||||
//unsigned uartConfig = 434;
|
||||
//unsigned uartConfig = 217;
|
||||
//unsigned uartConfig = 217;
|
||||
|
||||
cout << "Initializing UART on port " << uartPort << " with config=" << hex << setw(8) << setfill('0') << uartConfig << endl;
|
||||
uart = new UARTSIM(uartPort);
|
||||
uart->setup(uartConfig);
|
||||
cout << "litex_term socket://localhost:" << uartPort << " in a console, then hit enter here...." << endl;
|
||||
cin.get();
|
||||
#endif
|
||||
|
||||
|
||||
// do something
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
gpr[i] = 0;
|
||||
}
|
||||
|
||||
//just use hardware reset
|
||||
//root->soc->main_basesoc_soc_rst = 1;
|
||||
//cout << dec << setw(8) << cycle << " Resetting..." << endl;
|
||||
|
||||
const int clocks[2] = {0x1, 0x0}; // 1x
|
||||
const int ticks1x = 2;
|
||||
|
||||
while (!Verilated::gotFinish() && (ok | quiesceCount > 0) && cycle <= runCycles && !done) {
|
||||
|
||||
if (!resetDone && (cycle > resetCycle)) {
|
||||
//root->soc->main_basesoc_soc_rst = 0;
|
||||
//cout << dec << setw(8) << cycle << " Releasing reset." << endl;
|
||||
resetDone = true;
|
||||
}
|
||||
|
||||
if (threadStop && (cycle > threadRunCycle)) {
|
||||
//threadStop = 0x0;
|
||||
//m->an_ac_pm_thread_stop = threadStop;
|
||||
//cout << dec << setw(8) << cycle << " Thread stop=" << threadStop << endl;
|
||||
}
|
||||
|
||||
m->clk12 = clocks[tick % ticks1x];
|
||||
m->eval();
|
||||
|
||||
// 1x clock
|
||||
if ((tick % ticks1x) == 0) {
|
||||
|
||||
// core
|
||||
|
||||
// completion
|
||||
if (root->soc->A2P_WB->lastStageIsFiring) {
|
||||
v = root->soc->A2P_WB->lastStagePc;
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " C0: CP";
|
||||
cout << " 0:" << setw(6) << setfill('0') << hex << v;
|
||||
cout << " [" << setw(6) << setfill('0') << hex << root->soc->A2P_WB->lastStageInstruction << "]" << endl;
|
||||
if (quiesceCount > 0) {
|
||||
/* skip remaining checks */
|
||||
} else if (v == iarPass) {
|
||||
cout << "*** Passing IAR detected ***" << endl;
|
||||
quiesceCount = 5;
|
||||
} else if (v == iarFail) {
|
||||
cout << "*** Failing IAR detected ***" << endl;
|
||||
ok = false;
|
||||
quiesceCount = 5;
|
||||
} else if (v == lastCompIAR) {
|
||||
lastCompSame++;
|
||||
if (stopOnLoop && (lastCompSame == stopOnLoop)) {
|
||||
ok = false;
|
||||
cout << "*** Loop detected for " << dec << stopOnLoop << " iterations ***" << endl;
|
||||
}
|
||||
} else {
|
||||
lastCompIAR = v;
|
||||
lastCompSame = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// gpr change - really need to use these (to detect write w/same data)
|
||||
//reg [4:0] lastStageRegFileWrite_payload_address /* verilator public */ ;
|
||||
//reg [31:0] lastStageRegFileWrite_payload_data /* verilator public */ ;
|
||||
//wire UpdateRegFileWrite_valid /* verilator public */ ;
|
||||
//wire UpdateRegFileWrite_payload_valid /* verilator public */ ;
|
||||
//wire [4:0] UpdateRegFileWrite_payload_address /* verilator public */ ;
|
||||
//wire [31:0] UpdateRegFileWrite_payload_data /* verilator public */ ;
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
v = root->soc->A2P_WB->RegFilePlugin_regFile[i];
|
||||
if (v != gpr[i]) {
|
||||
gpr[i] = v;
|
||||
cout << dec << setw(8) << setfill('0') << cycle << " C0: GPR Update: R";
|
||||
cout << dec << setw(2) << setfill('0') << i << "=";
|
||||
cout << hex << setw(8) << setfill('0') << uppercase << v << " ";
|
||||
cout << endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// completion
|
||||
|
||||
// wb - soc can monitor-only
|
||||
if (wbRdPending) {
|
||||
if (root->soc->A2P_WB->dBusWB_ACK)
|
||||
if (debugWB)
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB RD ACK RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) <<
|
||||
" DATA=" << setw(8) << hex << setfill('0') << root->soc->A2P_WB->dBusWB_DAT_MISO << endl;
|
||||
|
||||
wbRdPending = false;
|
||||
|
||||
} else if (wbWrPending) {
|
||||
if (root->soc->A2P_WB->dBusWB_ACK)
|
||||
if (debugWB)
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB WR ACK RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) <<
|
||||
" SEL=" << setw(1) << setfill('0') << uppercase << hex << (unsigned int)root->soc->A2P_WB->dBusWB_SEL <<
|
||||
" DATA=" << setw(8) << hex << setfill('0') << root->soc->A2P_WB->dBusWB_DAT_MOSI << endl;
|
||||
wbWrPending = false;
|
||||
|
||||
} else if (root->soc->A2P_WB->dBusWB_CYC && root->soc->A2P_WB->dBusWB_STB) {
|
||||
if (!root->soc->A2P_WB->dBusWB_WE) {
|
||||
if (root->soc->A2P_WB->dBusWB_ACK) {
|
||||
if (debugWB)
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB RD ACK RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) <<
|
||||
" DATA=" << setw(8) << hex << setfill('0') << root->soc->A2P_WB->dBusWB_DAT_MISO << endl;
|
||||
} else if (!wbRdPending && debugWBReq) {
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB RD RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) << endl;
|
||||
wbRdPending = true;
|
||||
}
|
||||
} else {
|
||||
if (debugWB) {
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB WR ACK RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) <<
|
||||
" SEL=" << setw(1) << setfill('0') << uppercase << hex << (unsigned int)root->soc->A2P_WB->dBusWB_SEL <<
|
||||
" DATA=" << setw(8) << hex << setfill('0') << root->soc->A2P_WB->dBusWB_DAT_MOSI << endl;
|
||||
} else if (!wbWrPending && debugWBReq) {
|
||||
cout << dec << setw(8) << setfill('0') << uppercase << cycle << " WB WR RA=" << setw(8) << hex << setfill('0') << (root->soc->A2P_WB->dBusWB_ADR << 2) <<
|
||||
" SEL=" << root->soc->A2P_WB->dBusWB_SEL << " DATA=" << setw(8) << hex << setfill('0') << root->soc->A2P_WB->dBusWB_DAT_MOSI << endl;
|
||||
wbWrPending = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// leds, btns, mem, etc.
|
||||
|
||||
} else {
|
||||
|
||||
if (resetDone) {
|
||||
#ifdef UART
|
||||
m->serial_rx = (*uart)(m->serial_tx);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
m->eval(); // NEED THIS!!!!
|
||||
|
||||
// finish clock stuff
|
||||
if ((tick % ticks1x) == 0) {
|
||||
cycle++;
|
||||
if ((cycle % hbCycles) == 0) {
|
||||
cout << dec << setw(8) << setfill('0') << cycle << " ...tick..." << endl;
|
||||
}
|
||||
if (failMaxCycles && (cycle == runCycles)) {
|
||||
cout << "*** Max cycles reached ***" << endl;
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
tick++;
|
||||
|
||||
#ifdef TRACING
|
||||
t->dump(tick);
|
||||
t->flush();
|
||||
#endif
|
||||
|
||||
// check for fails
|
||||
|
||||
if (!ok && quiesceCount == 0) {
|
||||
quiesceCount = quiesceCycles;
|
||||
cout << "Quiescing..." << endl;
|
||||
} else if (quiesceCount > 0) {
|
||||
quiesceCount--;
|
||||
if (ok && quiesceCount == 0) {
|
||||
done = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#ifdef TRACING
|
||||
t->close();
|
||||
#endif
|
||||
m->final();
|
||||
|
||||
cout << endl << endl << tbName << endl;
|
||||
cout << endl << "Cycles run=" << dec << cycle << endl << endl;
|
||||
if (!ok) {
|
||||
cout << "You are worthless and weak." << endl;
|
||||
exit(EXIT_FAILURE);
|
||||
} else {
|
||||
cout << "You has opulence." << endl;
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
module BUFG (output O, input I);
|
||||
assign O = I;
|
||||
endmodule
|
||||
|
@ -0,0 +1,10 @@
|
||||
module DNA_PORT (DOUT, CLK, DIN, READ, SHIFT);
|
||||
|
||||
parameter [56:0] SIM_DNA_VALUE = 57'h0;
|
||||
|
||||
output DOUT;
|
||||
input CLK, DIN, READ, SHIFT;
|
||||
|
||||
assign DOUT = 1'b0;
|
||||
|
||||
endmodule
|
@ -0,0 +1,21 @@
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
|
||||
module FD (Q, C, D);
|
||||
|
||||
parameter INIT = 1'b0;
|
||||
|
||||
output Q;
|
||||
input C, D;
|
||||
|
||||
wire Q;
|
||||
reg q_out;
|
||||
|
||||
initial q_out = INIT;
|
||||
|
||||
always @(posedge C)
|
||||
q_out <= D;
|
||||
|
||||
assign Q = q_out;
|
||||
|
||||
endmodule
|
@ -0,0 +1,24 @@
|
||||
`timescale 1 ps / 1 ps
|
||||
|
||||
module FDCE (C, CE, CLR, D, Q);
|
||||
|
||||
parameter INIT = 1'b1;
|
||||
|
||||
output Q;
|
||||
|
||||
input C, CE, D, CLR;
|
||||
|
||||
wire Q;
|
||||
reg q_out;
|
||||
|
||||
initial q_out = INIT;
|
||||
|
||||
assign Q = q_out;
|
||||
|
||||
always @(posedge C or posedge CLR)
|
||||
if (CLR)
|
||||
q_out <= 0;
|
||||
else if (CE)
|
||||
q_out <= D;
|
||||
|
||||
endmodule
|
@ -0,0 +1,24 @@
|
||||
`timescale 1 ps / 1 ps
|
||||
|
||||
module FDPE (Q, C, CE, D, PRE);
|
||||
|
||||
parameter INIT = 1'b1;
|
||||
|
||||
output Q;
|
||||
|
||||
input C, CE, D, PRE;
|
||||
|
||||
wire Q;
|
||||
reg q_out;
|
||||
|
||||
initial q_out = INIT;
|
||||
|
||||
assign Q = q_out;
|
||||
|
||||
always @(posedge C or posedge PRE)
|
||||
if (PRE)
|
||||
q_out <= 1;
|
||||
else if (CE)
|
||||
q_out <= D;
|
||||
|
||||
endmodule
|
@ -0,0 +1,10 @@
|
||||
module IDELAYCTRL #(
|
||||
)(
|
||||
output RDY,
|
||||
input REFCLK,
|
||||
input RST
|
||||
);
|
||||
|
||||
assign RDY = !RST;
|
||||
endmodule
|
||||
|
@ -0,0 +1,24 @@
|
||||
// wtf didn't check what it actually does!
|
||||
|
||||
module IDELAYE2 #(
|
||||
parameter CINVCTRL_SEL,
|
||||
parameter DELAY_SRC,
|
||||
parameter HIGH_PERFORMANCE_MODE,
|
||||
parameter IDELAY_TYPE,
|
||||
parameter IDELAY_VALUE,
|
||||
parameter PIPE_SEL,
|
||||
parameter REFCLK_FREQUENCY,
|
||||
parameter SIGNAL_PATTERN
|
||||
)(
|
||||
input C,
|
||||
input CE,
|
||||
input IDATAIN,
|
||||
input INC,
|
||||
input LD,
|
||||
input LDPIPEEN,
|
||||
output DATAOUT
|
||||
);
|
||||
|
||||
assign DATAOUT = IDATAIN;
|
||||
endmodule
|
||||
|
@ -0,0 +1,13 @@
|
||||
//wtf nop
|
||||
|
||||
module IOBUF #(
|
||||
)
|
||||
(
|
||||
input I,
|
||||
input T,
|
||||
inout IO,
|
||||
inout O
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
@ -0,0 +1,13 @@
|
||||
//wtf nop
|
||||
|
||||
module IOBUFDS #(
|
||||
)
|
||||
(
|
||||
input I,
|
||||
input T,
|
||||
inout IO,
|
||||
inout IOB
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
@ -0,0 +1,31 @@
|
||||
//wtf doesnt do nothin!
|
||||
|
||||
module ISERDESE2 #(
|
||||
parameter DATA_RATE,
|
||||
parameter DATA_WIDTH,
|
||||
parameter INTERFACE_TYPE,
|
||||
parameter IOBDELAY,
|
||||
parameter NUM_CE,
|
||||
parameter SERDES_MODE
|
||||
)
|
||||
(
|
||||
input BITSLIP,
|
||||
input CE1,
|
||||
input CLK,
|
||||
input CLKB,
|
||||
input CLKDIV,
|
||||
input DDLY,
|
||||
input RST,
|
||||
output Q1,
|
||||
output Q2,
|
||||
output Q3,
|
||||
output Q4,
|
||||
output Q5,
|
||||
output Q6,
|
||||
output Q7,
|
||||
output Q8
|
||||
);
|
||||
|
||||
|
||||
endmodule
|
||||
|
@ -0,0 +1,95 @@
|
||||
`timescale 1 ps / 1 ps
|
||||
|
||||
module MMCME2_ADV #(
|
||||
parameter BANDWIDTH = "OPTIMIZED",
|
||||
parameter real CLKFBOUT_MULT_F = 5.000,
|
||||
parameter real CLKFBOUT_PHASE = 0.000,
|
||||
parameter CLKFBOUT_USE_FINE_PS = "FALSE",
|
||||
parameter real CLKIN1_PERIOD = 0.000,
|
||||
parameter real CLKIN2_PERIOD = 0.000,
|
||||
parameter real CLKOUT0_DIVIDE_F = 1.000,
|
||||
parameter real CLKOUT0_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT0_PHASE = 0.000,
|
||||
parameter CLKOUT0_USE_FINE_PS = "FALSE",
|
||||
parameter integer CLKOUT1_DIVIDE = 1,
|
||||
parameter real CLKOUT1_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT1_PHASE = 0.000,
|
||||
parameter CLKOUT1_USE_FINE_PS = "FALSE",
|
||||
parameter integer CLKOUT2_DIVIDE = 1,
|
||||
parameter real CLKOUT2_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT2_PHASE = 0.000,
|
||||
parameter CLKOUT2_USE_FINE_PS = "FALSE",
|
||||
parameter integer CLKOUT3_DIVIDE = 1,
|
||||
parameter real CLKOUT3_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT3_PHASE = 0.000,
|
||||
parameter CLKOUT3_USE_FINE_PS = "FALSE",
|
||||
parameter CLKOUT4_CASCADE = "FALSE",
|
||||
parameter integer CLKOUT4_DIVIDE = 1,
|
||||
parameter real CLKOUT4_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT4_PHASE = 0.000,
|
||||
parameter CLKOUT4_USE_FINE_PS = "FALSE",
|
||||
parameter integer CLKOUT5_DIVIDE = 1,
|
||||
parameter real CLKOUT5_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT5_PHASE = 0.000,
|
||||
parameter CLKOUT5_USE_FINE_PS = "FALSE",
|
||||
parameter integer CLKOUT6_DIVIDE = 1,
|
||||
parameter real CLKOUT6_DUTY_CYCLE = 0.500,
|
||||
parameter real CLKOUT6_PHASE = 0.000,
|
||||
parameter CLKOUT6_USE_FINE_PS = "FALSE",
|
||||
parameter COMPENSATION = "ZHOLD",
|
||||
parameter integer DIVCLK_DIVIDE = 1,
|
||||
parameter [0:0] IS_CLKINSEL_INVERTED = 1'b0,
|
||||
parameter [0:0] IS_PSEN_INVERTED = 1'b0,
|
||||
parameter [0:0] IS_PSINCDEC_INVERTED = 1'b0,
|
||||
parameter [0:0] IS_PWRDWN_INVERTED = 1'b0,
|
||||
parameter [0:0] IS_RST_INVERTED = 1'b0,
|
||||
parameter real REF_JITTER1 = 0.010,
|
||||
parameter real REF_JITTER2 = 0.010,
|
||||
parameter SS_EN = "FALSE",
|
||||
parameter SS_MODE = "CENTER_HIGH",
|
||||
parameter integer SS_MOD_PERIOD = 10000,
|
||||
parameter STARTUP_WAIT = "FALSE"
|
||||
)(
|
||||
output CLKFBOUT,
|
||||
output CLKFBOUTB,
|
||||
output CLKFBSTOPPED,
|
||||
output CLKINSTOPPED,
|
||||
output CLKOUT0,
|
||||
output CLKOUT0B,
|
||||
output CLKOUT1,
|
||||
output CLKOUT1B,
|
||||
output CLKOUT2,
|
||||
output CLKOUT2B,
|
||||
output CLKOUT3,
|
||||
output CLKOUT3B,
|
||||
output CLKOUT4,
|
||||
output CLKOUT5,
|
||||
output CLKOUT6,
|
||||
output [15:0] DO,
|
||||
output DRDY,
|
||||
output LOCKED,
|
||||
output PSDONE,
|
||||
|
||||
input CLKFBIN,
|
||||
input CLKIN1,
|
||||
input CLKIN2,
|
||||
input CLKINSEL,
|
||||
input [6:0] DADDR,
|
||||
input DCLK,
|
||||
input DEN,
|
||||
input [15:0] DI,
|
||||
input DWE,
|
||||
input PSCLK,
|
||||
input PSEN,
|
||||
input PSINCDEC,
|
||||
input PWRDWN,
|
||||
input RST
|
||||
);
|
||||
|
||||
assign CLKFBOUT = 1'b0; //feedback
|
||||
assign CLKOUT0 = CLKIN1;
|
||||
assign CLKOUT1 = CLKIN1;
|
||||
assign CLKOUT2 = CLKIN1;
|
||||
assign LOCKED = 1'b1;
|
||||
|
||||
endmodule
|
@ -0,0 +1,12 @@
|
||||
//wtf nop
|
||||
|
||||
module OBUFDS #(
|
||||
)
|
||||
(
|
||||
input I,
|
||||
inout O,
|
||||
inout OB
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
@ -0,0 +1,33 @@
|
||||
//wtf doesnt do nothin!
|
||||
|
||||
module OSERDESE2 #(
|
||||
parameter DATA_RATE_OQ,
|
||||
parameter DATA_RATE_TQ,
|
||||
parameter DATA_WIDTH,
|
||||
parameter SERDES_MODE,
|
||||
parameter TRISTATE_WIDTH
|
||||
)
|
||||
(
|
||||
input CLK,
|
||||
input CLKDIV,
|
||||
input DDLY,
|
||||
input RST,
|
||||
input D1,
|
||||
input D2,
|
||||
input D3,
|
||||
input D4,
|
||||
input D5,
|
||||
input D6,
|
||||
input D7,
|
||||
input D8,
|
||||
input OCE,
|
||||
input OFB,
|
||||
input T1,
|
||||
input TCE,
|
||||
output OQ,
|
||||
output TQ
|
||||
);
|
||||
|
||||
|
||||
endmodule
|
||||
|
@ -0,0 +1,93 @@
|
||||
`timescale 1ps / 1ps
|
||||
|
||||
module XADC (
|
||||
ALM,
|
||||
BUSY,
|
||||
CHANNEL,
|
||||
DO,
|
||||
DRDY,
|
||||
EOC,
|
||||
EOS,
|
||||
JTAGBUSY,
|
||||
JTAGLOCKED,
|
||||
JTAGMODIFIED,
|
||||
MUXADDR,
|
||||
OT,
|
||||
CONVST,
|
||||
CONVSTCLK,
|
||||
DADDR,
|
||||
DCLK,
|
||||
DEN,
|
||||
DI,
|
||||
DWE,
|
||||
RESET,
|
||||
VAUXN,
|
||||
VAUXP,
|
||||
VN,
|
||||
VP
|
||||
|
||||
);
|
||||
|
||||
output BUSY;
|
||||
output DRDY;
|
||||
output EOC;
|
||||
output EOS;
|
||||
output JTAGBUSY;
|
||||
output JTAGLOCKED;
|
||||
output JTAGMODIFIED;
|
||||
output OT;
|
||||
output [15:0] DO;
|
||||
output [7:0] ALM;
|
||||
output [4:0] CHANNEL;
|
||||
output [4:0] MUXADDR;
|
||||
|
||||
input CONVST;
|
||||
input CONVSTCLK;
|
||||
input DCLK;
|
||||
input DEN;
|
||||
input DWE;
|
||||
input RESET;
|
||||
input VN;
|
||||
input VP;
|
||||
input [15:0] DI;
|
||||
input [15:0] VAUXN;
|
||||
input [15:0] VAUXP;
|
||||
input [6:0] DADDR;
|
||||
|
||||
parameter [15:0] INIT_40 = 16'h0;
|
||||
parameter [15:0] INIT_41 = 16'h0;
|
||||
parameter [15:0] INIT_42 = 16'h0800;
|
||||
parameter [15:0] INIT_43 = 16'h0;
|
||||
parameter [15:0] INIT_44 = 16'h0;
|
||||
parameter [15:0] INIT_45 = 16'h0;
|
||||
parameter [15:0] INIT_46 = 16'h0;
|
||||
parameter [15:0] INIT_47 = 16'h0;
|
||||
parameter [15:0] INIT_48 = 16'h0;
|
||||
parameter [15:0] INIT_49 = 16'h0;
|
||||
parameter [15:0] INIT_4A = 16'h0;
|
||||
parameter [15:0] INIT_4B = 16'h0;
|
||||
parameter [15:0] INIT_4C = 16'h0;
|
||||
parameter [15:0] INIT_4D = 16'h0;
|
||||
parameter [15:0] INIT_4E = 16'h0;
|
||||
parameter [15:0] INIT_4F = 16'h0;
|
||||
parameter [15:0] INIT_50 = 16'h0;
|
||||
parameter [15:0] INIT_51 = 16'h0;
|
||||
parameter [15:0] INIT_52 = 16'h0;
|
||||
parameter [15:0] INIT_53 = 16'h0;
|
||||
parameter [15:0] INIT_54 = 16'h0;
|
||||
parameter [15:0] INIT_55 = 16'h0;
|
||||
parameter [15:0] INIT_56 = 16'h0;
|
||||
parameter [15:0] INIT_57 = 16'h0;
|
||||
parameter [15:0] INIT_58 = 16'h0;
|
||||
parameter [15:0] INIT_59 = 16'h0;
|
||||
parameter [15:0] INIT_5A = 16'h0;
|
||||
parameter [15:0] INIT_5B = 16'h0;
|
||||
parameter [15:0] INIT_5C = 16'h0;
|
||||
parameter [15:0] INIT_5D = 16'h0;
|
||||
parameter [15:0] INIT_5E = 16'h0;
|
||||
parameter [15:0] INIT_5F = 16'h0;
|
||||
|
||||
assign BUSY = 1'b0;
|
||||
assign DRDY = 1'b1;
|
||||
|
||||
endmodule
|
@ -0,0 +1 @@
|
||||
/home/wtf/projects/wbuart32
|
Loading…
Reference in New Issue