blob: 0af1b39f867e48fb8683f95f585697d59bf90450 [file] [log] [blame]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2017-2020 The Project X-Ray Authors.
#
# Use of this source code is governed by a ISC-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/ISC
#
# SPDX-License-Identifier: ISC
'''
This script generates a verilog ROM module that contains data to be transmitted
and received. The data is random.
'''
import random
def main():
template = """
`default_nettype none
// ============================================================================
module rom
(
input wire CLK,
input wire RST,
input wire RD,
output wire [{rom_width_minus_one}:0] O
);
// ============================================================================
reg [{rom_width_minus_one}:0] rom[0:{rom_size_minus_one}];
initial begin
{rom_data}
end
reg [{rom_width_minus_one}:0] dat;
reg [{rom_size_bits_minus_one}:0] adr;
always @(posedge CLK)
if (RST) adr <= 0;
else if (RD) adr <= adr + 1;
always @(posedge CLK)
if (RD) dat <= rom[adr];
assign O = dat;
// ============================================================================
endmodule
"""
rom_size_bits = 5
rom_size = 2**rom_size_bits
rom_width = 8
rom_data = [random.randint(0, 2**rom_width - 1) for i in range(rom_size)]
rom_data = "\n".join(
[
" rom[%4d] <= %d'd%d;" % (i, rom_width, d)
for i, d in enumerate(rom_data)
])
print(
template.format(
rom_size_bits_minus_one=rom_size_bits - 1,
rom_size_minus_one=rom_size - 1,
rom_width_minus_one=rom_width - 1,
rom_data=rom_data))
if __name__ == "__main__":
main()