一 . 赋值语句

1.连续赋值语句是数据流建模的基本语句,用于对 wire 型变量进行赋值。

比如assign xx = xx;

对于它有几点注意:

***等式右边的类型没有要求,等式右边的值一旦发生变化,就会立刻重新计算并同时赋值给左侧

***等式左边不能是寄存器类型,可以是线性变量

2.过程赋值语句

  • 过程赋值是在 initial 或 always 语句块里的赋值,主要用于对寄存器类型变量进行赋值
  • 寄存器变量在被赋值后,其值将保持不变,直到重新被赋予新值
  • 过程赋值只有在语句执行的时候,才会起作用
  • Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞赋值

always语句块

always @(event)
      [statement]
 always          {时序控制}     // 时序控制可不要
         过程赋值语句等

 第一个模板上面括号内的内容称为敏感变量,即整个always 语句当敏感变量有变化时被执行,否则不执行。

第二个模板表示always过程在0时间开始时执行其中的行为语句。当最后一句执行语句执行结束后,在时序控制下循环继续执行第一句执行语句直到仿真结束。如果缺少时序控制会一直喜欢下去。

在always块中,可以是时序逻辑,也可以是组合逻辑。时序逻辑和组合逻辑的区别在于always敏感列表中有没有时钟信号参与,有时钟信号参与的是时序逻辑,没有时钟信号参与的是组合逻辑。wire使用assign赋值,reg型适用于过程语句赋值,在always过程块中要求被赋值变量必须为reg型。

语句块中的语句会重复执行
 一个变量不能在多个 always 块中被赋值
在 always 块中被赋值的只能是 reg 型变量 

initial语句块 :

initial 
     [single statement]
 initial begin
     [multiple statements]
 end

该语句引导的过程快只执行一次,在0时刻开始并发执行到当前状态结束,在一个模块内每个initial块都是独立并发执行。

举两个例子

module stimulus;//定义一个模块
reg a,b,m;
      initial
      m = 1'b0; // 单个过程语句
     

      initial begin
         #5 a = 1'b1; // 多个过程语句情况
         #25 b = 1'b0;
      end
endmodule

这两种语句之间的执行是并行的,即语句的执行与位置顺序无关。

这两种语句通常与语句块begin ....end相结合(可以看initial语句的举例代码),则语句块中的执行是按顺序执行的。

与 fork...join 结合的时候:语句块中的语句并发执行,但该语句块不可综合,一般只用测试

3.if语句

实现的作用实际是选择器。 

assign out = (condition) ? x : y;

括号中的即为条件 

verilog语法memory赋值 verilog中赋值语句_fpga开发

condition为真,out值为x,为假,out=y.

上图的代码实现:

always @(*) begin
    if (condition) begin
        out = x;
    end
    else begin
        out = y;
    end
end