【问题标题】:How to automatically convert port signals of verilog sub modules using python?如何使用python自动转换verilog子模块的端口信号?
【发布时间】:2021-02-02 12:54:23
【问题描述】:

假设有一个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(穿透信号->特定输入),去掉逻辑2]

【问题讨论】:

  • 你不是在test_logic 中缺少.B_IN (b1) 吗?
  • 您的问题也很广泛,也缺少细节。根据您在此处显示的内容,答案很简单:解析U_logic 的接口并将端口x2 更改为x1。问题是更换的真正标准是什么
  • 不,但很好。实际上我认为 b2 信号由其他缩写实例连接(当实际 TOP 模块时)。你可以无视信号B,如果那会是一个客串的话。
  • 正如我提到的,你也说过,标准将改变端口信号 * -> *_IN 。并删除测试逻辑。我想你明白了,但我发现使用 python 很难解析它。
  • 同样,您的问题可能非常简单,这完全取决于附加条件。我的意思是,如果假设所有输入都作为您的示例ab 等。并且测试逻辑的输出是前缀/后缀,比如让我们说a_testb_test 等然后您需要做的就是为界面的每一行提供类似re.sub(r"(w+)_test", "\1", line) 的内容

标签: python verilog


【解决方案1】:

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

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 的声明,只需跳过所有行直到);
  • 所有其他行都在不更改的情况下传递到新文件。

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

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

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

【讨论】:

  • 感谢您的好意!!它确实有很大帮助。但是如果逻辑超过100,我是否必须在代码中一一声明所有逻辑名称,如“U_logic”和“U_testlogic”? (假设逻辑名称没有严格的一致性)我们不能将测试逻辑端口的所有信号都称为逻辑端口信号(*端口信号-> *_IN端口信号)再次感谢。
  • 您如何知道如何删除它们或如何测试*_IN?你必须有一些模式,否则这将如何工作?
  • 我假设逻辑和测试逻辑的名称相同并且每个都对应另一个并且它们的编号相同的情况。因此,即使数量超过 100,它们(一个逻辑和一个测试逻辑)也可以相互对应,例如 U_logic1 /U_testlogic1 , U_logic2 /U_testlogic2 ...等。
  • 嗯...这将需要对文件进行初始传递并将每个接口保存到字典中。然后,对文件进行第二次传递,并将主逻辑接口替换为测试中保存在 dict 中的那个。同样,这也需要一些模式才能在 logic 模块与其对应的 test 之间进行连接,我仍然无法确定您是否有
  • 好的。这将是最后一个问题,那么如果实例的名称是 U_logic1 / U_logic1_test , U_logic2/U_logic2_test ,..等等,是不是更容易实现?我知道你已经帮了很多忙。所以如果你给出任何线索假设情况就像那样,我会处理它。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 2015-01-21
相关资源
最近更新 更多