一、赋值语句
分为连续赋值语句、过程赋值语句
过程值又分为非阻塞赋值和阻塞赋值
1)
连续赋值语句assign
连续赋值语句之所以称之为连续,是为仿真器不断检测连续赋值语句右边的信号是否发生了变化,一旦,发生了变化,就重新计算连续赋值语句右边的信号值。
连续赋值语句之间是并发执行的。
不能用连续赋值语句对reg型变量赋值
2)
过程赋值语句是在initial和always中的赋值语句,赋值对象只能是reg类型的变量。
分为非阻塞赋值和阻塞赋值
a非阻塞赋值符号<=
多个非阻塞赋值语句出现在always结构中,只有always结构结束时才能完成赋值操作。这个过程好像没有阻断程序的运行,故称为非阻塞赋值。同步时序电路,建议采用非阻塞赋值。
b阻塞赋值符号=
阻塞赋值语句结束前不能执行后面的语句,只有当阻塞赋值语句结束后才能执行后面的语句。
二、条件语句
有三种形式
1、
if(条件表达式)
语句;
2、if(条件表达式)
语句1;
else 语句2;
3、
if(条件表达式)
语句1;
else if(条件表达式)
语句2;
。。。。
条件表达式的值为0,x,z就按假处理,如果为1,就按真处理。
三、case语句
格式
case(条件表达式)
<case 分支表达式>
endcase
另有casex和casez
casex:如果条件表达式中出现z,x或?,则不比较对应的那一位。
casez:条件表达式中只能够出现z或?而不能出现x
四、循环语句
四种:forever,repeat,while,for
1,forever
常用在initial语句中生成周期性的输入波形
格式
forever<语句>
forever #10 clk = ~clk;//每10个时间单位,时钟信号clk的状态改变一次。
2、repeat
执行指定循环次数的过程语句
格式
repeat(表达式)
语句;
3、while
格式
while(表达式)
语句;
4、for
格式
for(表达式1;表达式2;表达式3)
语句;
五、结构说明语句
1、initial
用于仿真初始化,初始化模块在仿真期间仅执行一次
格式
initial
begin
语句1;
。。。
end
2、always语句
是一个可以多次重复执行的语句
可以描述时序电路或组合电路
也可以描述仿真时需要的激励信号,如产生基本的时钟信号。
例如用always定义一个简单的时钟
initial
begin
clk =1;
end
always #10 clk = ~clk;//每10个时间单位,clk的状态改变一次。
3、task语句
包含几个语句的子程序,使用task语句可以简化程序的结构,增加可读性。
可以接受输入参数,且没有返回值。
格式
task <任务名>
<端口和数据类型说明语句>
<语句1>
<语句2>
。。。
endtask
调用格式
<任务名>(端口1,端口2,。。。)
4、function
可以以模块化的形式提高代码可读性,在程序中一处或多处调用,调用时的变量顺序和位宽必须和定义时的变量保持一致。
格式
function<返回值的类型和范围>(函数名);
<端口说明语句>
<变量类型说明语句>
<语句>
。。。
endfunction
六、块语句
两种:
begin end
fork join
1、顺序块
对于顺序块,起始时间就是第一条语句开始执行的时间,结束时间就是最后一条语句结束的时间。
格式
begin:块名
块内声明语句
语句1;
。。。
end
2、并行块
对于并行块来说,起始时间对于所有的语句都是相同的。
格式
fork:块名
块内声明语句
语句1;
。。。
join |