用Python实现括号内以p开头元素的指定二进制转换需求
拆分Verilog拼接赋值为独立信号赋值的Python实现
核心思路
要搞定这个需求,关键是解析Verilog的拼接语法,按信号位宽拆分十六进制对应的二进制串,步骤如下:
- 逐行读入输入文件,拆分出左侧的信号列表和右侧的十六进制赋值
- 把十六进制值转成对应位宽的二进制字符串(高位在前,符合Verilog拼接顺序)
- 遍历每个信号,跳过非
p开头的,计算目标信号的位宽,从二进制串里截取对应长度的位段 - 生成每个信号的独立赋值语句,对齐格式后写入输出文件
完整代码实现
def get_signal_width(signal): """提取信号的位宽:带[x:y]的计算位宽,无位宽的默认1位""" if '[' in signal: width_segment = signal.split('[')[1].split(']')[0] high, low = map(int, width_segment.split(':')) return high - low + 1 return 1 def hex_to_binary(hex_str): """把Verilog风格的十六进制(如4'hB)转成固定位宽的二进制字符串""" width_part, hex_val_part = hex_str.split("'h") bit_width = int(width_part) hex_value = int(hex_val_part, 16) # 转二进制并补前导零到指定位宽,高位在前 return bin(hex_value)[2:].zfill(bit_width) def process_single_line(line): """处理一行赋值语句,返回拆分后的p开头信号赋值列表""" # 拆分左右两部分 left_side, right_side = line.strip().split('=') # 提取大括号内的所有信号 signals_raw = left_side.strip().strip('{}') signal_list = [s.strip() for s in signals_raw.split(',')] # 提取右侧的十六进制赋值(去掉分号) hex_assignment = right_side.strip().strip(';') # 转成二进制字符串 binary_str = hex_to_binary(hex_assignment) # 遍历信号,拆分二进制位 assignments = [] current_bit_pos = 0 total_bits = len(binary_str) for sig in signal_list: if not sig.startswith('p'): # 跳过非p开头的信号,直接移动位指针 sig_width = get_signal_width(sig) current_bit_pos += sig_width continue # 计算当前信号的位宽 sig_width = get_signal_width(sig) # 截取对应位段(Verilog拼接是高位在前,所以从当前位置取width位) sig_binary = binary_str[current_bit_pos:current_bit_pos + sig_width] # 生成对齐的赋值语句 assignments.append(f"{sig:<15} = {sig_width}'b{sig_binary};") current_bit_pos += sig_width return assignments def main(): input_path = 'input1.txt' output_path = 'output.txt' all_results = [] # 读取输入文件 with open(input_path, 'r') as f_in: for line in f_in: if not line.strip(): continue line_results = process_single_line(line) all_results.extend(line_results) # 写入输出文件 with open(output_path, 'w') as f_out: for stmt in all_results: f_out.write(stmt + '\n') print(f"处理完成,结果已保存到 {output_path}") if __name__ == "__main__": main()
代码说明
- get_signal_width:处理两种信号格式,带位宽的比如
pRTY_a[2:0]计算位宽为3,无位宽的pDHY_asq默认位宽1 - hex_to_binary:严格按照Verilog的十六进制格式转换,确保二进制串的位宽和原赋值一致,高位在前
- process_single_line:核心处理逻辑,跳过无关信号,只提取
p开头的,按位宽拆分二进制串,生成对齐的赋值语句 - main:负责文件读写,把所有结果汇总写入输出文件
效果验证
运行代码后,处理示例输入文件得到的输出和需求中的示例完全一致,完美匹配信号的位宽和二进制赋值。
内容的提问来源于stack exchange,提问作者kts
相关产品推荐
相关产品推荐

