def get_wave(filename): vcd_filename = __get_vcd_filename__('%s.vvp' % filename[0:-2]) ftp_utils.download_file_to_tmp(vcd_filename) vcd = parse_vcd("./tmp/%s" % vcd_filename) units = get_timescale() i = 0 time = 0 endtime = get_endtime() data = { 'file': vcd_filename, 'scale': units, 'endtime': endtime, 'signals': [] } for key, value in vcd.iteritems(): name = value['nets'][0]['hier'] + "." + value['nets'][0]['name'] size = value['nets'][0]['size'] data['signals'].append({'name': name, 'size': size, 'wave': []}) time = 0 for item in value['tv']: wavestruct = [] val = item[1] wavestruct.append(item[0]) if val.find('z') > -1: wavestruct.append('z') elif val.find('x') > -1: wavestruct.append('x') else: wavestruct.append(val) data['signals'][i]['wave'].append(wavestruct) i += 1 return data
def get_wave(filename): vcd_filename = __get_vcd_filename__('%s.vvp' % filename[0:-2]) ftp_utils.download_file_to_tmp(vcd_filename) vcd = parse_vcd("./tmp/%s" % vcd_filename) units = get_timescale() i = 0 time = 0 endtime = get_endtime() data = {'file': vcd_filename, 'scale': units, 'endtime': endtime, 'signals': []} for key, value in vcd.iteritems(): name = value['nets'][0]['hier'] + "." + value['nets'][0]['name'] size = value['nets'][0]['size'] data['signals'].append({'name': name, 'size': size, 'wave': []}) time = 0 for item in value['tv']: wavestruct = [] val = item[1] wavestruct.append(item[0]) if val.find('z') > -1: wavestruct.append('z') elif val.find('x') > -1: wavestruct.append('x') else: wavestruct.append(val) data['signals'][i]['wave'].append(wavestruct) i += 1 return data
def __get_vcd_filename__(filename): ftp_utils.download_file_to_tmp(filename) verilog_file_data = open("./tmp/%s" % filename, 'r').read() try: vcd_file_name = verilog_file_data.split('"$dumpfile"')[1].split('"')[1] except IndexError: vcd_file_name = None return vcd_file_name
def check_for_errors(filename): ftp_utils.download_file_to_tmp(filename) p = subprocess.Popen(["verilator --lint-only ./tmp/%s" % filename], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT) data, err = p.communicate() return __format_errors__(data)
def check_for_errors(filename): ftp_utils.download_file_to_tmp(filename) p = subprocess.Popen( ["verilator --lint-only ./tmp/%s" % filename], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT ) data, err = p.communicate() return __format_errors__(data)
def __check_if_dumps_vcd_correctly__(filename): ftp_utils.download_file_to_tmp(filename) vcd_name = __get_vcd_filename__(filename) if vcd_name != None: if vcd_name.find("./tmp/") < 0: file_instance = open('./tmp/%s' % filename, 'r+') data = file_instance.read() data = data.replace('"$dumpfile", "', '"$dumpfile", "./tmp/', 1) file_instance.seek(0) file_instance.write(data) file_instance.close() ftp_utils.upload_file_from_tmp(filename)
def get_output(filename): vvp_filename = '%s.vvp' % filename[0:-2] __check_if_dumps_vcd_correctly__(vvp_filename) ftp_utils.download_file_to_tmp(vvp_filename) c = 'vvp ./tmp/%s' % vvp_filename p = subprocess.Popen([c], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT) data, err = p.communicate() __upload_dump_files__(vvp_filename) return data.split('\n')
def get_output(filename): vvp_filename = '%s.vvp' % filename[0:-2] __check_if_dumps_vcd_correctly__(vvp_filename) ftp_utils.download_file_to_tmp(vvp_filename) c = 'vvp ./tmp/%s' % vvp_filename p = subprocess.Popen( [c], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT ) data, err = p.communicate() __upload_dump_files__(vvp_filename) return data.split('\n')
def compile_to_vvp(filename, filename_test): ftp_utils.download_file_to_tmp(filename) ftp_utils.download_file_to_tmp(filename_test) c = 'iverilog -o ./tmp/%s.vvp ./tmp/%s ./tmp/%s' % ( filename[0:-2], filename, filename_test) p = subprocess.Popen([c], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT) data, err = p.communicate() if __format_error__(data) != []: return __format_error__(data) else: ftp_utils.upload_file_from_tmp('%s.vvp' % filename[0:-2])
def compile_to_vvp(filename, filename_test): ftp_utils.download_file_to_tmp(filename) ftp_utils.download_file_to_tmp(filename_test) c = 'iverilog -o ./tmp/%s.vvp ./tmp/%s ./tmp/%s' % (filename[0:-2], filename, filename_test) p = subprocess.Popen( [c], stdout=subprocess.PIPE, shell=True, stderr=subprocess.STDOUT ) data, err = p.communicate() if __format_error__(data) != []: return __format_error__(data) else: ftp_utils.upload_file_from_tmp('%s.vvp' % filename[0:-2])
def generate_testbench(filename): ftp_utils.download_file_to_tmp(filename) module = open('./tmp/%s' % filename, 'r').read() out = "" modname = get_module_name(module) tbmodname = modname + "_tb" period = 3 timescale = get_timescale(module) out += "// Automatically Generated Testbench for module " + modname + "\n" out += "// Generated on \n" out += "`timescale " + timescale + "\n \n" out += "module " + tbmodname + "; \n \n" regs = get_regs(module) wires = get_wires(module) clk = "clk" if "clk" in wires else "" rst = "rst" if "rst" in wires else "" for i in regs: out += "reg " + i + "; \n" for i in wires: out += "wire " + i + "; \n" out += "\n" out += modname + " DUT ( " for i in regs: out += "." + i + "(" + i + ")" out += ", " for i in wires: out += "." + i + "(" + i + ")" if i != wires[-1]: out += ", " out += " ); \n \n" out += "initial begin \n" out += "$dumpfile (" + '"' + tbmodname + ".vcd" + '"' + "); \n" out += "$dumpvars (1, " + tbmodname + "); \n" out += "#1000 $finish; \n" out += "end\n \n" if clk != "": out += "// Clock Generator \n" out += "initial " + clk + " = 0; \n" out += "always #" + str(period/2.0) + " " + clk + " = ~" + clk + "; \n \n" out += "// Reset generator goes here, change to match your design \n" out += "initial begin \n" if clk != "": out += rst + " = 0; \n" out += "@ (negedge clk); \n" out += rst + " = 1; \n" else: out += "// Write your test case here \n" out += "end\n \n" out += "endmodule\n" testbench_file = open('./tmp/%s_tb.v' % filename[0:-2], 'w') testbench_file.write(out) testbench_file.close() ftp_utils.upload_file_from_tmp('%s_tb.v' % filename[0:-2]) return out