-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconfiguration-apply.py
executable file
·135 lines (124 loc) · 6.27 KB
/
configuration-apply.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/python3
# generates configuration files for Verilog source, 'os', 'emulator' and clock constraints
import configuration as cfg
import os
script_dir = os.path.dirname(os.path.realpath(__file__))
os.chdir(script_dir)
memory_end_address = 2**(cfg.RAM_ADDRESS_BITWIDTH+cfg.RAM_ADDRESSING_MODE)
with open('os/src/os_start.S', 'w') as file:
file.write('# generated - do not edit (see `configuration.py`)\n')
file.write('.global _start\n')
file.write('_start:\n')
file.write(' li sp, {}\n'.format(
hex(memory_end_address)))
file.write(' j run\n')
with open('os/src/os_config.hpp', 'w') as file:
file.write('// generated - do not edit (see `configuration.py`)\n')
file.write('#pragma once\n')
file.write('#define LED ((unsigned volatile *)0xffff\'fffc)\n')
file.write('#define UART_OUT ((int volatile *)0xffff\'fff8)\n')
file.write('#define UART_IN ((int volatile *)0xffff\'fff4)\n')
file.write('#define SDCARD_BUSY ((int volatile *)0xffff\'fff0)\n')
file.write('#define SDCARD_READ_SECTOR ((unsigned volatile *)0xffff\'ffec)\n')
file.write('#define SDCARD_NEXT_BYTE ((int volatile *)0xffff\'ffe8)\n')
file.write('#define SDCARD_STATUS ((unsigned volatile *)0xffff\'ffe4)\n')
file.write('#define SDCARD_WRITE_SECTOR ((unsigned volatile *)0xffff\'ffe0)\n')
file.write('#define MEMORY_END {}\n'.format(hex(
memory_end_address)))
with open('emulator/src/main_config.hpp', 'w') as file:
file.write('// generated - do not edit (see `configuration.py`)\n')
file.write('#pragma once\n')
file.write('#include <cstdint>\n\n')
file.write('namespace osqa {\n\n')
file.write('// memory map\n')
file.write('std::uint32_t constexpr led = 0xffff\'fffc;\n')
file.write('std::uint32_t constexpr uart_out = 0xffff\'fff8;\n')
file.write('std::uint32_t constexpr uart_in = 0xffff\'fff4;\n')
file.write('std::uint32_t constexpr sdcard_busy = 0xffff\'fff0;\n')
file.write('std::uint32_t constexpr sdcard_read_sector = 0xffff\'ffec;\n')
file.write('std::uint32_t constexpr sdcard_next_byte = 0xffff\'ffe8;\n')
file.write('std::uint32_t constexpr sdcard_status = 0xffff\'ffe4;\n')
file.write('std::uint32_t constexpr sdcard_write_sector = 0xffff\'ffe0;\n')
file.write('std::uint32_t constexpr io_addresses_start = 0xffff\'ffe0;\n')
file.write('std::uint32_t constexpr memory_end = {};\n'.format(hex(
memory_end_address)))
file.write('\n} // namespace osqa\n')
with open('src/configuration.sv', 'w') as file:
file.write('// generated - do not edit (see `configuration.py`)\n')
# file.write(
# '// note: "localparam" not "parameter" to avoid warnings in Gowin EDA\n')
file.write('\n')
file.write('package configuration;\n')
file.write('\n')
file.write(' parameter int unsigned CLOCK_FREQUENCY_HZ = {};\n'.format(
cfg.CLOCK_FREQUENCY_HZ))
file.write(' parameter int unsigned CPU_FREQUENCY_HZ = {};\n'.format(
cfg.CPU_FREQUENCY_HZ))
file.write(' parameter int unsigned RAM_ADDRESS_BITWIDTH = {};\n'.format(
cfg.RAM_ADDRESS_BITWIDTH))
file.write(' parameter int unsigned RAM_ADDRESSING_MODE = {};\n'.format(
cfg.RAM_ADDRESSING_MODE))
file.write(' parameter int unsigned CACHE_COLUMN_INDEX_BITWIDTH = {};\n'.format(
cfg.CACHE_COLUMN_INDEX_BITWIDTH))
file.write(' parameter int unsigned CACHE_LINE_INDEX_BITWIDTH = {};\n'.format(
cfg.CACHE_LINE_INDEX_BITWIDTH))
file.write(' parameter int unsigned UART_BAUD_RATE = {};\n'.format(
cfg.UART_BAUD_RATE))
file.write(' parameter int unsigned FLASH_TRANSFER_FROM_ADDRESS = 32\'h{};\n'.format(
f'{cfg.FLASH_TRANSFER_FROM_ADDRESS:08x}'))
file.write(' parameter int unsigned FLASH_TRANSFER_BYTE_COUNT = 32\'h{};\n'.format(
f'{cfg.FLASH_TRANSFER_BYTE_COUNT:08x}'))
file.write(' parameter int unsigned STARTUP_WAIT_CYCLES = {};\n'.format(
cfg.STARTUP_WAIT_CYCLES))
file.write('\n')
file.write('endpackage\n')
with open(cfg.BOARD_NAME+'.sdc', 'w') as file:
file.write('// generated - do not edit (see `configuration.py`)\n')
file.write('\n')
ClockMHz = cfg.CLOCK_FREQUENCY_HZ/1000000
ClockPeriod = 1/ClockMHz*1000
ClockWaveform = ClockPeriod/2
file.write('// {} MHz\n'.format(ClockMHz))
file.write('create_clock -name clk -period {:.4f} -waveform {{0 {:.4f}}} [get_ports {{clk}}]\n'.format(
ClockPeriod, ClockWaveform))
with open('scripts/configuration.sh', 'w') as file:
file.write('# generated - do not edit (see `configuration.py`)\n')
file.write('\n')
file.write('#\n')
file.write('# scripts related configurations\n')
file.write('#\n')
file.write('\n')
file.write('BOARD_NAME="{}"\n'.format(cfg.BOARD_NAME))
file.write(
'# used when flashing the bitstream to the FPGA and generating SDC file\n')
file.write('\n')
file.write('BITSTREAM_FILE="{}"\n'.format(cfg.BITSTREAM_FILE))
file.write('# location of the bitstream file relative to project root\n')
file.write('\n')
file.write('BITSTREAM_FLASH_TO_EXTERNAL={}\n'.format(
int(cfg.BITSTREAM_FLASH_TO_EXTERNAL)))
file.write(
'# 0 to flash the bitstream to the internal flash, 1 for the external flash\n')
file.write('\n')
file.write('BITSTREAM_FILE_MAX_SIZE_BYTES={}\n'.format(
cfg.BITSTREAM_FILE_MAX_SIZE_BYTES))
file.write(
'# used to check if the bitstream file size is within the limit of flash storage\n')
file.write('\n')
file.write('FIRMWARE_FILE="{}"\n'.format(
cfg.FIRMWARE_FILE))
file.write(
'# location of the firmware file relative to project root\n')
file.write('\n')
file.write('FIRMWARE_FILE_MAX_SIZE_BYTES={}\n'.format(
cfg.FIRMWARE_FILE_MAX_SIZE_BYTES))
file.write(
'# used to check if the firmware file size is within the limit of flash storage\n')
file.write('\n')
file.write('FIRMWARE_FLASH_OFFSET=0x{:08x}\n'.format(
cfg.FIRMWARE_FLASH_OFFSET))
FIRMWARE_FLASH_OFFSET = 0x00000000
file.write(
'# used to specify the offset in the flash storage where the firmware will be written\n')
print("generated:\n * /"+cfg.BOARD_NAME +
".sdc\n * /src/configuration.sv\n * /os/src/os_start.S\n * /os/src/os_config.hpp\n * /emulator/src/main_config.hpp\n * /scripts/configuration.sh")