pyverilog:可以解析verilog和生成verilog的python库

我记得在实验室调试 FPGA 时彻夜不眠。
当时,Verilog 代码存在一个小缺陷。
当时我盯着屏幕,一行行代码就像一个没有出口的迷宫。
突然我想起了一个新工具:pyverilog。
我下载了它,按照文档操作,并尝试用它来解析一些混乱的 Verilog 代码。

那天是2 02 2 年3 月1 5 日,地点是实验室的一个包间。
我打开了pyverilog文档,它详细介绍了如何使用pyverilog来解析模块和端口。
我记得输入“python example_parser.py mymodule.v”,神奇的事情发生了。

端口列表简单易懂,每个端口的类型和方向一目了然。
我还能够看到我忽略的多位端口定义,结果是 6 4 位宽。
等等,我还发现了一个我以前没有注意到的子模块的实例。
我一直认为太密集的是always块。

那一刻,我明白了pyverilog的强大。
它不仅仅是一个工具,还是一盏指路明灯,照亮您穿过复杂的代码迷宫。
但我还是觉得如果这个工具能够自动优化你的代码该多好啊。

SystemVerilog中的Packed和Unpacked数组

Mos,讲的是SystemVerilog中的打包数组和非打包数组,这两件事需要详细解释一下。
我们先来谈谈打包集。
这个东西物理上是连续存储的,相当于一个整数或者单个向量。
你看,我之前在 2 01 6 年发表的一篇文章中写道,当声明打包数组时,维度位于数组名称之前,这使得存储高效,尤其是对于按位运算。

例如,我看到一个数组打包为 bit[3 :0]p。
p3 到 p0 这四个位在物理空间中是连续的。
还有二维压缩数组,如bit[3 :0][7 :0]m_data,4 行8 列,总共3 2 位,也是连续存储的。
你可以在照片中看到它,就像2 01 9 年博客上出现的那样。

至于Unpacked集合,这个东西的物理存储不一定是连续的,每个元素可以分布在不同的地方。
维度声明在组名之后,其适用场景也与Packed不同。
例如,解包数组适合存储不同类型的元素,或者需要灵活访问元素的场景。

比如一个bitP[3 :0],这个uP是一个拆包数组,uP0到uP3 可以分布在几个地方。
另一个例子是解压缩的四维数组,logicuP[3 :0][2 :0][1 :0][7 :0]。
存储空间的大小取决于元素的大小和数量。

打包和未打包也可以组合使用,如logic[3 1 :0]v1 [7 :0]。
虽然 v1 是一维未压缩数组,但每个元素都是 3 2 位压缩数组。

一般来说,打包数组持久化存储、快速访问、方便按位运算;解包数组是不连续的、灵活的,适合存储不同类型的元素。
两者各有优点,大家应该根据自己的实际情况进行选择。
我记得当时我不太明白,但是实践之后我就慢慢明白了。

system verilog 数据结构(转)

说白了,动态数组其实很简单。
它只知道正在进行中的元素数量,但不知道编译时的元素数量。
例如,在我们去年运行的一个项目中,我们在模拟过程中根据需求动态确定元素的数量。
还有一点是,只要元素数量不相同,就可以将固定数组分配给动态数组。

起初我以为动态数组只是由进程创建的,但后来我意识到这是错误的。
它也可以在模拟过程中创建。
等等,还有一件事,如果你想在模拟过程中动态地知道元素的数量,记得合理分配内存空间,避免出现内存缺口。
至于队列,它实际上是一种先进先出的数据结构。
您可以插入、删除、排序、搜索以及直接将固定数组或动态数组分配给队列。
很多人不注意这一点。
事实上,队列系统非常灵活。

联合协商也是一个关键点。
它充分利用了内存中的专用空间和中断空间。
例如,索引值可以是整数、字符、甚至一维数组。
例如,标准数组连续存储在内存中,但关联数组使用较少的内存。
操作方面,终止、查找、删除等。

数组操作也很丰富,比如算术运算、排序、翻转、排序、查找首元素、特殊数组等。
其中有一个关键的列表比如sum函数,用于计算位宽。
和去年的项目一样,我们使用求和来计算位和。

总之,固定数组在编译时知道它们的大小,而动态数组在运行时知道它的大小。
队列是 FIFO 或堆栈,而关联数组是单独的数据存储器,其中索引可以是数字或字符串。
结构类型可用于将变量分组在一起,例如在总线协议中。
枚举类型是定义命名整数值的便捷方法。

我认为值得一试。
将这些知识点应用到实际项目中,编程会变得更加有趣和你会发现它很有效率。