1 Star 0 Fork 0

pantao / verilog-connector

Create your Gitee Account
Explore and code with more than 6 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README.md

PyVerilogConnector

这个工具可以用来:

  • 连接 Verilog 子模块生成 Verilog 网表
  • 生成 Verilog 例化模版(读入一个 Verilog 文件然后直接导出)

一、安装

需要安装 PyYAML、PySide2

推荐使用命令

pip3 install PyYAML --user
pip3 install PySide2 --user

二、主要思路

TEST\xor_nand\dump.yaml 可以看出,主要的数据包括两个字典:instance_list、io_list。其中 instance_list 的第一级的键名为 Verilog 实例名,键值为模块名和两个字典:parameters、ports。parameters 是参数字典,ports 是端口字典。

参数字典中,存储参数名和参数值。注意,这个参数值是文本格式的,因为往往端口宽度有可能是一个表达式,关于端口方向的计算,后面会解释。

端口字典中,以端口名作为键名,键值是字典,有三个键:direction、width、signal,其中 signal 可缺省。

  • direction 是方向,取值有 input、output、inout
  • width 是宽度,要么是空字符,要么是 [*:*] 格式的文本,其中 * 指代任意字符串。

端口宽度的计算:使用全字匹配,把端口宽度定义中的 * 替换为参数的值,这里需要重复若干次,直到 * 完全变成纯数字的表达式。然后用 eval 去计算。如果遍历完参数字典里的所有内容,端口定义还不能变成这种形式,说明有问题。

io_list 的第一级键名是 I/O 信号名,键值是字典,有 direction, width 两个键。

宏定义的处理办法:预设一个空的宏定义字典,逐行读入Verilog 文件,发现宏定义变量就进行替换,发现宏定义就补充到宏定义字典。

三、主要 python 代码模块

1. class VerilogTools

这个类只有read_verilog_file_to_dict 这一个静态方法。

我打算以后有涉及到对 Verilog 文件本身的操作,都写成静态方法添加到这里。

2. class VerilogInstance

这个类和上面的静态方法返回的字典是对应的。

或者说它负责具体在内存里存储 Verilog。

另外它提供一些操作 Verilog 字典的方法。

3. class VerilogNetlist

Verilog 网表

四、GUI

整个程序应该只有一个 VerilogNetlist 实例,GUI 通过 update_ui 函数,读取该实例更新UI,同时,GUI 的操作应当调用该实例的方法同步修改。

GUI 使用 PySide2 编写,PyVerilogConnectorMain.ui 是 Qt 的 UI 文件,使用 qt designer 创建。

Windows / Linux 可以执行:pip3 install pyqt5designer --user 安装,安装后执行 designer 就可以打开 Qt Designer。

五、示例:四个与非门构成异或门电路的搭建

sch

1. 添加 Verilog 实例

img1

2. 设置 I/O

img2

3 添加互连线

3.1 直接输入信号名

img3

如图,u_1 的 a 连接信号 a,在文本框输入信号名,同时会有提示下拉栏弹出,便于连接已有信号。输入完成后点击 apply,或者回车。

3.2 选择目的 instance 生成互联信号

img4

如图设置好后点击 Generate Wire,生成了 z_from_u_0

之后其它端口要连接这个信号,直接使用前面所述的提示功能就可以了。

4. 设置网表名、保存网表、导出 Verilog 网表

img5

本程序使用 YAML 保存配置,建议设置文件扩展名为 yaml

导出的 Verilog 网表默认为 top,它是导出的 Verilog 网表的模块名。如图导出的 Verilog 文件内容为:

module xor_nand(
    input  wire        a,
    input  wire        b,
    output wire        z
);
wire        z_from_u_0;
wire        z_from_u_1;
wire        z_from_u_2;
nand_gate u_0 (
    .a                 (   a),
    .b                 (   b),
    .z                 (z_from_u_0)
);

nand_gate u_1 (
    .a                 (   a),
    .b                 (z_from_u_0),
    .z                 (z_from_u_1)
);

nand_gate u_2 (
    .a                 (z_from_u_0),
    .b                 (   b),
    .z                 (z_from_u_2)
);

nand_gate u_3 (
    .a                 (z_from_u_1),
    .b                 (z_from_u_2),
    .z                 (   z)
);

endmodule

验证:到 TEST\xor_nand 执行

iverilog nand_gate.v gen.v xor_test.v
vvp a.out 

得到结果:

                     0, a = 0, b = 0, z = 0
                    10, a = 0, b = 1, z = 1
                    20, a = 1, b = 0, z = 1
                    30, a = 1, b = 1, z = 0
xor_test.v:19: $finish called at 40 (1s)

六、Debug

最开始编写这个程序时,没有考虑调试的问题,一旦出现故障,往往需要回到报错的语句,添加打印相关数据的语句,然后再次运行程序进行判断。因为运行 GUI 时,程序不接受命令行输入。

为了亡羊补牢,UI 界面上有个 Test 按钮,该按钮绑定 test 函数,代码里搜索 def test 可以找到,这个函数可以访问程序的数据,如果程序出现异常可以编辑这个函数帮助 Debug。

函数内容暂时设定为:

    def test(self):
        print(main_verilog_netlist.to_dict())

即打印网表的内容。我在编写程序的时常发生 UI 和实际数据不一致的情况,这里直接打印出来,可以帮助判断故障情况。

Repository Comments ( 0 )

Sign in to post a comment

About

Verilog top 模块快速例化互联 expand collapse
Verilog and 2 more languages
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
1
https://gitee.com/pantao1227/verilog-connector.git
git@gitee.com:pantao1227/verilog-connector.git
pantao1227
verilog-connector
verilog-connector
master

Search