EECS151 / riscv-cpu / scripts / rom_generator.py
rom_generator.py
Raw
import wave
import random
import struct
import sys
import math

generated_verilog_filepath = sys.argv[2]
memory_file = sys.argv[1]
memory_depth = int(sys.argv[3])
memory_width = int(sys.argv[4])
address_bits = int(math.ceil(math.log(memory_depth, 2)))
data_bits = memory_width

with open(memory_file, 'r') as memory_data:
    data = memory_data.read()

data = data.split('\n')

verilog_file = open(generated_verilog_filepath, 'w')
verilog_file.write("module rom (input [%d:0] address, output reg [%d:0] data, output [%d:0] last_address);\n" % (address_bits - 1, data_bits - 1, address_bits - 1))
verilog_file.write("  assign last_address = %d;\n" % (min(len(data) - 1, memory_depth - 1)))
verilog_file.write("  always @ (*) begin\n")
verilog_file.write("    case(address)\n")

for i in range(0, memory_depth):
    if (i >= len(data) or len(data[i]) == 0): # Write a 0
        verilog_file.write("      %d'd%d: data = %d'd%d;\n" % (address_bits, i, data_bits, 0))
    else:
        verilog_file.write("      %d'd%d: data = %d'd%d;\n" % (address_bits, i, data_bits, int(data[i])))

verilog_file.write("    endcase\n")
verilog_file.write("  end\n")
verilog_file.write("endmodule\n")
verilog_file.close()