如何使用python自动转换verilog子模块的端口信号?

How to automatically convert port signals of verilog sub modules using python?

假设有一个 TOP 模块,一个逻辑 (logic1) 和一个测试逻辑 (logic2),如左图所示。

我想排除右图中的测试逻辑(所有verilog形式)。

首先,如果我们假设所有的逻辑(逻辑和测试逻辑)都在TOP模块内部实例化,

verilog代码的左边应该是这样的。 (假设a->蓝色,b->黄色,c->红色,d->绿色,信号b穿透测试逻辑)

module TOP (

input  a1,
input  b1,
input  c1,
output d1
);
wire   b2;
wire   c2;

logic1 U_logic(
.A (a1),
.B (b2),
.C (c2),
.D (d1),
);

logic2 U_testlogic(
.B    (b2),
.C_IN (c1),
.C    (c2),
);

endmodule

右边的verilog代码应该是这样的。

module TOP (

input  a1,
input  b1,
input  c1,
output d1
);

logic1 U_logic(
.A (a1),
.B (b1),
.C (c1),
.D (d1),
);

endmodule

如果逻辑和测试逻辑的个数都超过100个,很难手动排除所有的测试逻辑,如何使用Python代码自动处理(逻辑个数和测试逻辑相同)?

主要目的是将测试逻辑(logic2)的端口信号转换为逻辑(logic1)的端口信号,去除测试逻辑。 [前任。 c2->c1(.C口信号->.C_IN口信号),b2->b1(穿透信号->特定输入),去掉logic2]

可能的解决方案概要如下:

import re

with open("test.txt") as in_file, open("output.txt", 'w') as out_file:
    for line in in_file:
        if "U_logic" in line:
            out_file.write(line)
            for line in in_file:
                if ");" in line:
                    break
                out_file.write(re.sub(r"(\.\w+\s*\(\w+)2", r"\g<1>1", line))

        elif "U_testlogic" in line:
            for line in in_file:
                if ");" in line:
                    break

        else:
            out_file.write(line)

它的作用是:

  • 解析文件的每一行。
  • 一旦遇到U_logic的声明,开始一个新的循环并:
    • 将每一行写入新文件,直到到达 );。替换本身由显示的正则表达式完成,可以在 this demo.
    • 中观察和修改
  • 一旦达到 U_testlogic 的声明,只需跳过所有行,直到 );.
  • 所有其他行都传递给新文件而不做任何更改。

这只是一个大纲,因为可能还有更多案例需要统计:

  • 模块有参数怎么办?
  • 如果);与上一个端口在同一行怎么办?
  • 如果整个实例化在一行上呢?
  • 等等等

我会留给你解决这些细节。