You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 19:32:15