选项 | 作用 |
---|---|
Schematic | 将所写代码构成电路图展现出来。 |
IP Catalog | 文件中所带的库函数 |
RTL ANALYSIS | 得出RTL图 |
SYNTHESIS | 对代码进行综合 |
IMPLEMENTATION | 对代码进行综合实现电路图 |
- 0:逻辑0—“假”
- 1:逻辑1—“真”
- x 或X: 未知
- z或Z:高阻
😶现阶段常用的数据类型说明:x意味着信号数值的不确定;z意味着信号处于高阻状态,常见于( input ,reg )没有驱动时的逻辑结果。
线网 wire 由其连接的器件输出连续驱动,如果没有驱动元件连接到wire型变量,缺省值一般为 “Z”
寄存器 reg 表示存储单元,保持原有值直到被改写。可在任意时刻通过赋值 *** 作进行改写。
向量 位宽大于1时,wire或reg可声明为向量的形式。有点像C语言中的字符数组(字符串)。
定义向量时在中括号中给出了位数,定义位数时先写MSB的序号再写LSB的序号。当用向量表示数字时,术语MSB和LSB的意义是很直观的,在其余情况中,位选信号只是用来区分向量中不同位的.
示例:
reg [3:0] counter ; //声明4bit位宽的寄存器counter
wire [32-1:0] gpio_data; //声明32bit位宽的线型变量gpio_data
wire [8:2] addr ; //声明7bit位宽的线型变量addr,位宽范围为8:2
reg [0:31] data ; //声明32bit位宽的寄存器变量data, 最高有效位为0
整数 integer
声明时不用指明位宽,位宽和编译器有关,一般为32bit。reg型变量为无符号数,而integer型变量为有符号数。
实数 real
可用十进制或科学计数法来表示。实数声明不能带有范围,默认值为0。
时间 time
对仿真时间进行保存,宽度一般为64 bit,通过调用系统函数$time获取当前仿真时间。
数组
Verilog中允许声明reg,wire,integer,time,real及其向量类型的数组。数组维度没有限制。线网数组也可以用于连接实例模块的端口。数组中的每个元素都可以作为一个标量或向量。对于多维数组来讲用户需要说明每一维的索引。
示例:
integer flag [7:0] ; //8个整数组成的数组 reg [3:0] counter [3:0] ; //由4个4bit计数器组成的数组 wire [7:0] addr_bus [3:0] ; //由4个8bit wire型变量组成的数组 wire data_bit[7:0][5:0] ; //声明1bit wire型变量的二维数组 reg [31:0] data_4d[11:0][3:0][3:0][255:0] ; //声明4维的32bit数据变量数组
对数组元素赋值 *** 作:
flag [1] = 32'd0 ; //将flag数组中第二个元素赋值为32bit的0值 counter[3] = 4'hF ; //将数组counter中第4个元素的值赋值为4bit 十六进制数F,等效于counter[3][3:0] = 4'hF,即可省略宽度; assign addr_bus[0] = 8'b0 ; //将数组addr_bus中第一个元素的值赋值为0 assign data_bit[0][1] = 1'b1; //将数组data_bit的第1行第2列的元素赋值为1,这里不能省略第二个访问标号,即 assign data_bit[0] = 1'b1; 是非法的。 data_4d[0][0][0][0][15:0] = 15'd3 ; //将数组data_4d中标号为[0][0][0][0]的寄存器单元的15~0bit赋值为3
向量是一个单独的元件,位宽为n;数组由多个元件组成,其中每个元件的位宽为n或1.它们在结构的定义上就有所区别。
存储器
存储器变量就是一种寄存器数组,可以用来描述RAM或者ROM的行为。
参数 parameter
表示常量,只能赋值一次。但是,通过实例化的方式,可以更改参数在模块中的值。局部参数用__localparam__来声明,作用与用法和parameter相同,区别在于它的值不能被改变。所以当参数只在本模块中调用时,可用localparam来说明。
字符串
字符串保存在reg类型的变量中,每个字符占用一个字节(8bit)。因此寄存器变量的宽度应该足够大,保证不会溢出。
字符串不能多行书写,字符串中不能包含回车符。如果寄存器变量的宽度大于字符串的大小,用0填充左边的空余位;反之截断删除。
如同C语言中,特殊字符特殊表示法,如下:
转义字符 | 显示字符 |
---|---|
\n | 换行 |
\t | 制表符 |
%% | % |
|| | |
" | " |
\ooo | 1到3个八进制数字字符 |
assign 对输出信号进行连续赋值
采用连续赋值描述电路:
module example3(x1,x2,s,f);
input x1,x2,s;
output f;
assign f=(~s&x1)|(s&x2);
endmodule
always@() 包含着过程语句
- ‘@’ 后面括号中的内容称为敏感事件列表,当用Verilog进行电路综合时,敏感事件列表直观告诉Verilog编译器哪些信号会直接影响 always 块产生的输出(可以用 * 代替所有信号 )
- 一个 always 块可以只包含一条语句,也可以包含多条语句。一个典型的Verilog模块中可以包含多个 always 块。
示例:
//Behavioral specification
module example(x1,x2,s,f);
input x1,x2,s;
output f;
reg f;
always @(x1 or x2 or s)
if(s==0)
f=x1;
else
f=x2;
endmodule
begin -and 相当于C语言里的大括号
😶Verilog 中的语句其实 Verilog 中的大部分语句和C语言中的语法差不多,但其中有些细节不一样:
if … else
示例:
module mux2to1(w0,w1,w2,S,f);//2悬疑
input w0,w1,w2;
input [1:0]S;
output reg f;
always @*
if(S==0)
f=w0;
else
f=w1;
endmodule
case
将控制表达式的值和每个选择语句的值按位进行比较,当有一个或多个选择匹配时,只执行第一个匹配的语句。当指定的选择不能包含控制表达式的所有可能值时,就必须包含default语句,否则Verilog编译器会综合存储器单元以处理未定义情况。
-
casex:
casex 语句将所有z和x值作为无关项。 -
casez:
casez 语句将所有z作为无关项对待。
简单的示例:
module dec2to4(W,En,Y); //二进制2-4译码器
input [1:0]W;
input En;
output reg [0:3]Y;
always @(W,En)
case({En,W}) // { , } 拼接向量
3'b100:Y=4'b1000;//四位二进制数字
3'b101:Y=4'b0100;
3'b110:Y=4'b0010;
3'b111:Y=4'b0001;
default:Y=4'b000;
endcase
endmodule
for
注意:写到条件的时候,不存在 ++ 运算符,只能写作x=x+1。
示例:
module priority(W,Y,z);
input [3:0]W;
output reg[1:0]Y;
output reg z;
integer k;//整数
always@(W)
begin
Y=2'bx;
z=0;
for(k=0;k<4;k=k+1)
if(W[k])
begin
Y=k;
z=1;
end
end
endmodule
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)