always @(s1 or s2 or a1 or a2 or a3 or a4 or out) //任何信号的变化都会引起输出变量的重新计算
begin
case ({s1,s2}) //位拼接运算
2'b00: out=a1;
2'b01: out=a2;
2'b10: out=a3;
2'b11: out=a4;
default: out=1'bx; //保持语句的严整性
endcase
end
endmodule
4、循环语句
Verilog语法**有4中循环语句,这里只简单说一下C语言里没有的两种
(1) forever语句
连续执行语句,这种语句主要用在产生周期性的波形,用来做仿真信号。个人理解和always语句差不多的功能,但是,forever语句只能用在initial块中。
(2)repeat 语句后面接常量表达式,可以指定循环次数,例如;
repeat (8)
begin
…
end
表示循环8次相应语句。
5、顺序块和并行块
所谓顺序块就是前面说的begin…end,他的作用就是把多条语句组合到一起执行,在顺序块里面,语句是一条一条顺序执行的,如果遇到#10延迟语句,延迟也是相对于上一条语句的延迟,这一点比较重要。
相对于顺序块的就是并行块,用fork…end语句表示,并行块里的语句是同时执行的。
顺序块和并行块可以嵌套使用。
如果在begin或者fork语句后面加上名字,这个块语句就成了命名块,例如
begin :xiaomo
……
end
命名块有什么好处呢?有了命名块,我们就可以用verilog提供的disable语句来随时终止命名块,例如disable xiaomo;这样,当程序运行到此时,就会禁用命名块,就会直接跳出块语句,相当于C语言里面的break语句一样,看下面这个例子: