赞
踩
verilog中if语句有3种格式
e.g
格式1 if(表达式) e.g if(a>b) out1=int1; 格式2 if(表达式) 语句1 else 语句2 e.g if(a>b) out1=int1 else out1=int2 格式3 if(表达式1) 语句1 else if(表达式2) 语句2; else if(表达式3) 语句3; ...... else if(表达式m) 语句m; else 语句n;
说明:
if( )
begin
if( )语句1(内嵌if)
end
else
语句2
case语句处理多分支选择,case语句通常用于微处理器的指令译码,它的一般形式如下:
(1)case(expression) <case分支项> endcase
(2)casez(expression) <case分支项> endcase
(3)casex(expression) <case分支项> endcase
case表达式一般格式
分支表达式: 语句;
默认项(default项): 语句
需要注意的是:case语句的所有表达式值的位宽必须相等,只有这样,控制表达式和分支表达式才能进行对应位的比较,不可以用’bx和’bz来替代n’bx,n’bz,因为信号x,z的默认宽度是机器的字节宽度,通常是32位。
verilog语言有3种类型的条件语句
类比C语言即可。
举例:
//使用case语句实现四选一多路选择器 module mux4_to_1(out,i0,i1,i2,i3,s1,s0); //根据输入\输出图的端口声明 output out ; input i0,i1,i2,i3; input s1,s0; //把输出变量声明为寄存器类型 reg out; //任何输入信号改变,都会引起输出信号的重新计算 //使输出out重新计算的所有输入信号必须写入always@(...)的变量列表中 always@(s1 or s0 or i0 or i1 or i2 or i3) begin case({s1,s0}) 2'b00:out=i0; 2'b01:out=i1; 2'b10:out=i2; 2'b11:out=i3; default:out=1'bx; endcase end endmodule
verilog中有4中类型的循环语句
forever 语句;
或者
forever begin多条语句 end
forever循环语句常用于产生周期性波形,作为仿真测试信号,它与always语句不同之处在于其不能单独出现在程序中,必须写在initial块中
repeat语句;
或者
repeat(表达式) begin多条语句; end
在repeat语句中,其表达式常为常量表达式
while(表达式)语句;
while(表达式) begin 多条语句; end
for(表达式1;表达式2;表达式3)语句;
顺序块
//顺序块 //不带延迟 reg z,y; reg[1:0] z,w;//位宽2 initial begin x=1'b0; y=1'b1; z={x,y}; w={y,x}; end //带延迟 reg x,y; reg[1:0]z,w; initial begin x=1'b0;//在仿真时刻0完成 #5 y=1'b1;//在仿真时刻5完成 #10 z={x,y}; #15 w={y,x}; end
并行块
//并行块
//带延迟
reg x,y;
reg[1:0]z,w;
initial
fork
x=1'b0;
#5 y=1'b0;
#10 z={x,y};
#20 w={y,x};
join
该块语句故意引进了什么竞争,我也看不懂。。。
两条语句在同一时刻对同一个变量产生影响,就会引起竞争。上述代码中,所有语句都在仿真时刻0时进行,但是实际执行顺序未知
从仿真角度来讲,并行块中所有语句都是一起执行的,实际上运行仿真程序时,CPU在任一时刻只能执行一条语句,不同的仿真器按照不同的顺序执行
可以将并行块的关键字fork看成是将一个执行流分成多个独立的执行流,关键字join将多个独立的执行流合并成一个执行流,每个独立的执行流之间都是并发执行的。
嵌套块、命名块、命名块的禁用
块可以嵌套使用,顺序块和并行块可以混合在一起使用
diable可以用来从循环中退出,处理错误条件,根据控制信号来控制某些代码是否被执行。对于disable紧接在块语句后面的那条语句被执行,类比c语言break跳出循环二disable可以禁用任意一个命名块。
举例,举例我也看不懂,真烦,不举例了,累了。。
编写代码时,必须在模块中说明生成的实例范围,关键字generate-endgenerate来指定范围
生成实例可以是以下一个或者多个类型
循环生成语句允许使用者对下面的模块项进行多次实例引用:
//对两个N位总线变量进行按位异或 module bitwise_xor(out,i0,i1); //参数声明语句 parameter N=32;//总线的数量为32 //端口声明语句 output [N-1:0] out; input [N-1:0] i0,i1; //声明一个临时循环变量 //该变量只用于生成块的循环计算 //verilog仿真时该变量在设计中不存在 genvar j; //用一个单循环生成按位异或的异或门 generate for(j=0;j<N;j=j+1) begin:xor_loop xor gl(out[j],i0[j],i1[j]); end//在生成块内部结束 endgenerate//结束生成块 endmodule
另一种写法
//另一种方法,异或门可以用always块代替
reg[N-1:0] out;
generate
for(j=0;j<N;j=j+1)
begin:bit//块名bit
always@(i0[j] or i1[j]) out[j]=i0[j]^i1[j];
end
endgenerate
条件生成语句类似于if_else_if的生成构造,该结构可以在设计模块中根据经过仔细推敲并确定表达式,有条件地调用以下这些结构
举例,用case生成语句实现N位加法器
//n位加法器 module adder(co,sum,a0,a1,ci) parameter n=4; //端口声明 output[n-1:0] sum; output co; input[n-1:0] a0,a1; input ci; //根据总线的位宽,调用相应的加法器,参数n在调用时可以重新定义,不同位宽的加法器是根据不同的n来觉得的 generate case(n) //当n=1或n=2是分别选用位宽为1位或2位的加法器,调用之前的 1:adder_1bit adder1(co,sum,a0,a1,ci);//1位的加法器 2:adder_2bit adder2(co,sum,a0,a1,ci);//2位的加法器 //默认情况下选用位宽n位的超前加法器 default:adder_cla #(n) adder3(co,sum,a0,a1,ci); endcase
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。