如何使用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
的声明,只需跳过所有行,直到 );
.
- 所有其他行都传递给新文件而不做任何更改。
这只是一个大纲,因为可能还有更多案例需要统计:
- 模块有参数怎么办?
- 如果
);
与上一个端口在同一行怎么办?
- 如果整个实例化在一行上呢?
- 等等等
我会留给你解决这些细节。
假设有一个 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
的声明,只需跳过所有行,直到);
. - 所有其他行都传递给新文件而不做任何更改。
这只是一个大纲,因为可能还有更多案例需要统计:
- 模块有参数怎么办?
- 如果
);
与上一个端口在同一行怎么办? - 如果整个实例化在一行上呢?
- 等等等
我会留给你解决这些细节。