本项目数据为门级网表数据,来源于Trust-Hub数据集,有若干个基准电路,这些门级网表电路的编写语言为Verilog HDL语言。
本文主要首先提及一下Verilog HDL语言的基本语法,然后以几个电路的代码为例,解析一下该电路代码中包含的电路数据。
目录
一、Trust-Hub数据集知识
(1)门级网表是指组成电路原件的是逻辑门或者与逻辑门同级别的电路元件,这些组电路的逻辑门原件通过线网连接;
(2)电路的逻辑结构由Verilog HDL编程语言编写,以module开始,以endmodule结束,中间定义电路的输入输出,各个端口以及所有线网名称;
(3)需要对门级网表的电路结构抽象为有向图模型后才能进行特征提取;
(4)数据举例如下:
——以下为将门级网表抽象为有向图的示例:
——门级网表数据举例如下所示:
二、Verilog HDL基本语法
2.1 基本语法概述
(1)output,input 关键字指定(整个电路门)输入输出;
(2)always @(posedge/negedge clk) 语句,每当clk出现上升/下降沿时,就执行接下来的语句块(并行赋值,非阻塞式赋值<=)。这种语句构成时序逻辑,当前输出与上一个时刻的值有关。
(3)reg类变量用<=赋值,左侧寄存器,右侧新的值;
(4)&q语句输出数字q每一位相与的结果(0/1);
(5)wire类型只是一根导线,只能用来组合逻辑;
(6)assign,过程赋值语句,使用 " = ",语句等号右侧改变,等号左侧立刻得到结果;
(7)always,连续赋值语句,使用 " <= ",语句块里面的值是并行改变,且只能在@号后面的条件满足的时刻改变;
(8)intial语句后面跟begin-end语句块,初始化语句;
(9)时序逻辑:<=赋值;组合逻辑:=赋值;
2.2 变量
两种类型,nets和register:
1. nets:连线形
一个单纯的变量,使用 " = " 赋值;
wire为最常见的nets型变量;
(1)常用来表示assign语句赋值的组合逻辑信号;
(2)取值为:0,1,x(不定值),z(高阻);
2. register:寄存器类型变量
在always语句里使用 " <= " 赋值;
最常用的是reg;
2.3 运算符
主要注意逻辑运算符和位运算符:
1. 逻辑运算符
&&(与),||(或),!(非)
——前两个是双目,最后一个是单目;
2. 位运算符
~(按位非),&,|,^(按位异或)
其余参考博客:Verilog HDL | 简介与基本语法 - 简书
2.4 语句
1. 语句概述
(1)赋值语句:连续赋值语句assign,过程赋值语句always @(敏感列表);
(2)循环语句:forever,repeat,while,for;
(3)结构说明语句:initial,always,task,function;
(4)编译预处理语句:define,include,timescale;
2. 详解
(1)always语句块
always @(<敏感信号表达式>)
begin
...
end
——敏感信号表达式前加posedge和negedge关键字可指定上升沿或者下降沿触发,采用并行赋值<=方法,寄存器变量reg;
——里面赋值语句采用非阻塞赋值<=;
(2)initial语句块
——一个初始化的语句块,上机即执行;
(3)连续赋值assign语句块
——连续赋值语句块,顺序执行;
——对wire类型变量进行赋值,即时改变;
(4)过程赋值语句
——一般在always语句块;
——常用于对reg变量赋值;
——阻塞赋值 " = " 和非阻塞赋值 " <= " ;
3. 举例
(1)例1:always语句块
always @(posedge clk) //当该时钟信号满足,类似于一个判断语句
if(cnt==4'd15) //4'd15表示4位十进制数,15
t_en<=1'b1; //1'b1表示一位二进制数,1
else
t_en<=1'b0; //1'b0表示一位二进制数,0
assign f=t_en&f_m;
(1)句中always为连续赋值语句,@引导一个敏感列表;assign是过程赋值语句。
(2)句中<=和=都是赋值语句,分别为非阻塞式赋值和阻塞式赋值。
——非阻塞式赋值方式为:b<=a,常用于编写综合的时序逻辑模块
——非阻塞式赋值就像D触发器那样,需要等到下一次always里面的敏感事件满足,再次执行always块程序的时候赋值才能成功(即类似于一个判断条件的赋值语句);且语句是并行执行的;
——阻塞式赋值,赋值语句执行后,值立马改变;且语句是顺序执行的;
(2)例2:always的并行执行
// For e.g.
...
always @(posedge clk)
begin
b <= a
c <= b
end
...
// 上升沿来前,假设b=1,a=2
// 则上升沿来时,b=2,c=1,即c获得b的旧值
// 原因是非阻塞赋值下,两个赋值语句并行执行
// 若将<=全部改为=,则c=2,因为阻塞赋值是顺序执行的
对于过程赋值语句,如果是边沿触发,我们在
always
语句块里用 <=
赋值,期望综合后生成寄存器;如果是电平触发,那么这个语句块实际上描述的是一段组合逻辑,我们使用 = 赋值,期望综合后不使用寄存器,而生成一个组合逻辑电路。
详细语法知识可参考下面两篇博客: