顺序语句块 begin end

顺序块用关键字 begin 和 end 来表示。
顺序块中的语句是一条条执行的。当然,非阻塞赋值除外。
顺序块中每条语句的时延总是与其前面语句执行的时间相关。
在本节之前的仿真中,initial 块中的阻塞赋值,都是顺序块的实例。

并行语句块 fork join

并行块有关键字 fork 和 join 来表示。
并行块中的语句是并行执行的,即便是阻塞形式的赋值。
并行块中每条语句的时延都是与块语句开始执行的时间相关。

`timescale 1ns/1ns
module test ;
    reg [3:0]   ai_sequen, bi_sequen ;
    reg [3:0]   ai_paral,  bi_paral ;
    reg [3:0]   ai_nonblk, bi_nonblk ;
 //============================================================//
    //(1)Sequence block
    initial begin
        #5 ai_sequen         = 4'd5 ;    //at 5ns
        #5 bi_sequen         = 4'd8 ;    //at 10ns
    //(2)fork block
    initial fork
        #5 ai_paral          = 4'd5 ;    //at 5ns
        #5 bi_paral          = 4'd8 ;    //at 5ns
    //(3)non-block block
    initial fork
        #5 ai_nonblk         <= 4'd5 ;    //at 5ns
        #5 bi_nonblk         <= 4'd8 ;    //at 5ns
endmodule

仿真波形:
在这里插入图片描述

顺序块和并行块还可以嵌套使用。

`timescale      1ns/1ns
module test ;
    reg [3:0]   ai_sequen2, bi_sequen2 ;
    reg [3:0]   ai_paral2,  bi_paral2 ;
    initial begin
        ai_sequen2         = 4'd5 ;    //at 0ns
            #10 ai_paral2          = 4'd5 ;    //at 10ns
            #15 bi_paral2          = 4'd8 ;    //at 15ns
        #20 bi_sequen2      = 4'd8 ;    //at 35ns
endmodule

在顺序块中的并行块,其时间以并行块中的最长时间为准;故上例子中,fork块中的持续时间为15个时间单位;仿真模拟图如下:
在这里插入图片描述

我们可以给块语句结构命名。
块被命名后,可以通过层次名引用的方法对变量进行访问。

`timescale 1ns/1ns
module test;
    initial begin: runoob   //命名模块名字为runoob,分号不能少
        integer    i ;       //此变量可以通过test.runoob.i 被其他模块使用
        i = 0 ;
        forever begin
            #10 i = i + 10 ;      
    reg stop_flag ;
    initial stop_flag = 1'b0 ;
    always begin : detect_stop
        if ( test.runoob.i == 100) begin //i累加10次,即100ns时停止仿真
            $display("Now you can stop the simulation!!!");
            stop_flag = 1'b1 ;
        #10 ;
endmodule

仿真结果如下:
在这里插入图片描述

If 语句

If语句语法

条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。
条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号中。
条件语句使用结构说明如下:

if (condition1)       true_statement1 ;
else if (condition2)        true_statement2 ;
else if (condition3)        true_statement3 ;
else                      default_statement ;
  1. if 语句执行时,如果 condition1 为真,则执行 true_statement1 ;如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。
  2. else if 与 else 结构可以省略,即可以只有一个 if 条件判断和一组执行语句 ture_statement1 就可以构成一个执行过程。
  3. else if 可以叠加多个,不仅限于 1 或 2 个。
  4. ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。
  5. if 条件每次执行的语句只有一条,可以不使用 begin 与 end 关键字。但如果是嵌套if语句,即: if-if-else 的形式,即便执行语句只有一条,也使用 begin 与 end 关键字也会引起歧义。所以条件语句中加入 begin 与 and 关键字就是一个很好的习惯。

Case语句

case 语句是一种多路条件分支的形式,用来解决 if 语句中有多个条件选项时使用不方便的问题。

Case语句语法

case(case_expr)
    condition1     :             true_statement1 ;
    condition2     :             true_statement2 ;
    default        :             default_statement ;
endcase
  1. case 语句执行时,如果 condition1 为真,则执行 true_statement1 ; 如果 condition1 为假,condition2 为真,则执行 true_statement2;依次类推。如果各个 condition 都不为真,则执行 default_statement 语句。

  2. default 语句是可选的,且在一个 case 语句中不能有多个 default 语句。

  3. 条件选项可以有多个,不仅限于 condition1、condition2 等,而且这些条件选项不要求互斥。虽然这些条件选项是并发比较的,但执行效果是谁在前且条件为真谁被执行。

  4. ture_statement1 等执行语句可以是一条语句,也可以是多条。如果是多条执行语句,则需要用 begin 与 end 关键字进行说明。

  5. case 语句中的条件选项表单式可以是常量,也可以是 x 值或 z 值。

  6. 当多个条件选项下需要执行相同的语句时,多个条件选项可以用逗号分开,放在同一个语句块的候选项中。

  7. case 语句中的 x 或 z 的比较逻辑是不可综合的,所以一般不建议在 case 语句中使用 x 或 z 作为比较值。

Verilog 循环语句有 4 种类型,分别是 while,for,repeat,和 forever 循环。
循环语句只能在 always 或 initial 块中使用,但可以包含延迟表达式。

while语句语法

while (condition) begin
  1. while 循环中止条件为 condition 为假。
  2. 如果开始执行到 while 循环时 condition 已经为假,那么循环语句一次也不会执行。
  3. 当然,执行语句只有一条时,关键字 begin 与 end 可以省略。
`timescale 1ns/1ns
module test ;
    reg [3:0]    counter ;
    initial begin
        counter = 'b0 ;
        while (counter<=10) begin
            #10 ;
            counter = counter + 1'b1 ;
   //stop the simulation
    always begin
        #10 ;  if ($time >= 1000) $finish ;
endmodule

for语句语法

for(initial_assignment; condition ; step_assignment)  begin
  1. initial_assignment 为初始条件。
  2. condition 为终止条件,condition 为假时,立即跳出循环。
  3. step_assignment 为改变控制变量的过程赋值语句,通常为增加或减少循环变量计数。
  4. 一般来说,因为初始条件和自加操作等过程都已经包含在 for 循环中,所以 for 循环写法比 while 更为紧凑,
// for 循环语句
integer      i ;
reg [3:0]    counter2 ;
initial begin
    counter2 = 'b0 ;
    for (i=0; i<=10; i=i+1) begin
        #10 ;
        counter2 = counter2 + 1'b1 ;

repeat 语句语法

repeat (loop_times) begin
  1. repeat 的功能是执行固定次数的循环,它不能像 while 循环那样用一个逻辑表达式来确定循环是否继续执行。
  2. repeat 循环的次数必须是一个常量、变量或信号。
  3. 如果循环次数是变量信号,则循环次数是开始执行 repeat 循环时变量信号的值。即便执行期间,循环次数代表的变量信号值发生了变化,repeat 执行次数也不会改变。
// repeat 循环语句
reg [3:0]    counter3 ;
initial begin
    counter3 = 'b0 ;
    repeat (11) begin  //重复11次
        #10 ;
        counter3 = counter3 + 1'b1 ;

forever 语句语法

forever begin
  1. forever 语句表示永久循环,不包含任何条件表达式,一旦执行便无限的执行下去,系统函数 $finish 可退出 forever。
  2. forever 相当于 while(1) 。
  3. 通常,forever 循环是和时序控制结构配合使用的。

产生一个时钟信号:

reg          clk ;
initial begin
    clk       = 0 ;
    forever begin
        clk = ~clk ;
3.5.7   `unconnected_drive和
           `nounconnected_drive	18
3.5.8   `celldefine 和 `endcelldefine	18
3.6   值集合	18
3.6.1   整型数	18
3.6.2   实数	19
3.6.3   字符串	20
3.7   数据类型	20
3.7.1   线网类型	20
3.7.2   未说明的线网	23
3.7.3   向量和标量线网	23
3.7.4   寄存器类型	23
3.8   参数	26
第4章   表达式	28
4.1   操作数	28
4.1.1   常数	28
4.1.2   参数	29
4.1.3   线网	29
4.1.4   寄存器	29
4.1.5   位选择	29
4.1.6   部分选择	29
4.1.7   存储器单元	30
4.1.8   函数调用	30
4.2   操作符	30
4.2.1   算术操作符	31
4.2.2   关系操作符	33
4.2.3   相等关系操作符	33
4.2.4   逻辑操作符	34
4.2.5   按位操作符	35
4.2.6   归约操作符	36
4.2.7   移位操作符	36
4.2.8   条件操作符	37
4.2.9   连接和复制操作	37
4.3   表达式种类	38
第5章   门电平模型化	39
5.1   内置基本门	39
5.2   多输入门	39
5.3   多输出门	41
5.4   三态门	41
5.5   上拉、下拉电阻	42
5.6   MOS开关	42
5.7   双向开关	44
5.8   门时延	44
5.9   实例数组	45
5.10   隐式线网	45
5.11   简单示例	46
5.12   2-4解码器举例	46
5.13   主从触发器举例	47
5.14   奇偶电路	47
第6章   用户定义的原语	49
6.1   UDP的定义	49
6.2   组合电路UDP	49
6.3   时序电路UDP	50
6.3.1   初始化状态寄存器	50
6.3.2   电平触发的时序电路UDP	50
6.3.3   边沿触发的时序电路UDP	51
6.3.4   边沿触发和电平触发的混合行为	51
6.4   另一实例	52
6.5   表项汇总	52
第7章   数据流模型化	54
7.1   连续赋值语句	54
7.2   举例	55
7.3   线网说明赋值	55
7.4   时延	55
7.5   线网时延	57
7.6   举例	57
7.6.1   主从触发器	57
7.6.2   数值比较器	58
第8章   行为建模	59
8.1   过程结构	59
8.1.1   initial 语句	59
8.1.2   always语句	61
8.1.3   两类语句在模的使用	62
8.2   时序控制	63
8.2.1   时延控制	63
8.2.2   事件控制	64
8.3   语句	65
8.3.1   顺序语句	66
8.3.2   并行语句	67
8.4   过程性赋值	68
8.4.1   语句内部时延	69
8.4.2   阻塞性过程赋值	70
8.4.3   非阻塞性过程赋值	71
8.4.4   连续赋值与过程赋值的比较	72
8.5   if 语句	73
8.6   case语句	74
8.7   循环语句	76
8.7.1   forever 循环语句	76
8.7.2   repeat 循环语句	76
8.7.3   while 循环语句	77
8.7.4   for 循环语句	77
8.8   过程性连续赋值	78
                                    1、 if-else if-else 单if语句if语句(if-elseif-…elseif-else)综合出来的电路没有优先级,从电路的角度来说,单if语句综合出来的电路类似于数据选择器,else路选通的条件是前面所有的if条件都不满足。
always@(*) begin
    z = 0;       
    if(sel1) 
         z = a;
    else if(sel2)
         z = b;
    else if(sel3)
         z = c;
                                    事例 if 条件每次执行的语句只有一条,没有使用 begin 与 end 关键字。但如果是 if-if-else 的形式,即便执行语句只有一条,不使用 begin 与 end 关键字也会引起歧义。当然,编译器一般按照就近原则,使 else 与最近的一个 if(例子第二个 if)相对应。例如下面代码,虽然格式上加以区分,但是 else 对应哪一个 if 条件,是有歧义的。条件语句用关键字 if 和 else 来声明,条件表达式必须在圆括号。条件(if)语句用于控制执行语句要根据条件判断来确定是否执行。
                                    关注、星标公众号,精彩内容每日送达来源:网络素材在这篇文章,我们讨论了verilog常用的两个结构-if语句case语句。我们在上一篇文章已经看到了如何使用程序(例如 always 来编写按顺序执行的 verilog 代码。我们还可以在程序使用许多语句来控制在我们的verilog设计信号赋值的方式。这些语句统称为顺序语句case 语句和 if 语句都是 verilog 顺序...
                                    当全部使用if判断时,优先级从上到下(往下优先级越高),如果在某一级(设为第n级)的if下加入了else,则当第n级不成立时,则执行else语句,前面的n-1级的判断即使成立也将无效。
当使用if /else if判断时,第一级优先级最高,当第n级结果成立后,后面的n+1,n+2...等即使成立也不再进行判断。
转载于:https://www.cnblogs.com/lightmonste...
                                    仿真通常会依次执行一组Verilog语句。这些语句被放置在一个程序。在Verilog主要有两种类型的程序--initial和always。
. . . // statements that perform the work of the task
. . .
c = foo1; // the assignments that initial...
                                    always@(posedge clk) begin
	s_axis_gamma_tready &amp;amp;amp;lt;= m_axis_gamma_rready ;
	if(resetn) begin
		m_axis_gamma_tvalid &amp;amp;amp;lt;= s_axis_gamma_rvalid 	 ;
		m_axis_gamma_tlast  &amp;amp;amp;lt;= s_axis_gamma_rlast	 ;
		m_...
                                    在做FPGA、CPLD时可以选择VHDL语言和Verilog语言,刚接触FPGA开发,VHDL和Verilog都简单的接触学习了一下。排除两者在功能实现、具体细节上的差异,作为经常使用C语言的人来说,Verilog语言在语法上显得更有亲和力。Verilog支持if…else if…else…的判断语法结构,与C语言类似,且也支持判断语句嵌套,支持某判断分支下执行多条语句。虽然与C语言类似,但因为它...