verilog 非阻塞
时间: 2023-08-08 07:08:52 浏览: 36
Verilog中的非阻塞赋值(non-blocking assignment)是指在一个时钟周期结束后才会对变量进行赋值操作。它使用“<=”符号来进行赋值,例如:
```
always @(posedge clk) begin
a <= b;
c <= d;
end
```
在上面的代码中,a和c都是非阻塞赋值。这意味着在时钟上升沿到来时,b和d的值都被读取并被存储在寄存器中,而a和c的值则会在下一个时钟周期的开始被更新为b和d的值。这样做的好处是可以避免竞争条件的问题。
需要注意的是,非阻塞赋值只能在时序逻辑中使用。在组合逻辑中,应该使用阻塞赋值(blocking assignment)来代替,使用“=”符号进行赋值,例如:
```
always @* begin
if (sel) begin
out = a;
end else begin
out = b;
end
end
```
相关问题
verilog非阻塞赋值
Verilog 非阻塞赋值(Non-blocking Assignment,简称“<=”)是一种并发赋值语句,它可以用于描述时序逻辑。与阻塞赋值(Blocking Assignment)不同的是,非阻塞赋值语句的执行不会直接影响到当前的时钟周期,而是在下一个时钟周期开始时才会生效。
例如,下面是一个简单的 Verilog 代码片段,使用非阻塞赋值语句来描述一个 D 触发器:
```
always @(posedge clk) begin
q <= d;
end
```
在上述代码中,当时钟上升沿到来时,非阻塞赋值语句 `q <= d;` 会被执行,将输入信号 `d` 的值赋给输出信号 `q`。由于这是一个非阻塞赋值语句,因此该操作不会直接影响到当前时钟周期的输出,而是在下一个时钟周期开始时生效。
需要注意的是,当出现多个非阻塞赋值语句时,它们的执行顺序是不确定的,因此需要使用阻塞赋值语句(Blocking Assignment,简称“=”)来保证执行顺序。例如,下面是一个简单的 Verilog 代码片段,使用阻塞赋值语句和非阻塞赋值语句来描述一个 4 位计数器:
```
always @(posedge clk) begin
count <= count + 1; // 非阻塞赋值语句
if (count == 4'd15) begin
reset = 1; // 阻塞赋值语句
count <= 0; // 非阻塞赋值语句
end else begin
reset = 0; // 阻塞赋值语句
end
end
```
在上述代码中,首先使用非阻塞赋值语句 `count <= count + 1;` 来实现计数器的计数功能。当计数器的值达到 15 时,使用阻塞赋值语句 `reset = 1;` 将复位信号置为 1,并使用非阻塞赋值语句 `count <= 0;` 将计数器清零。最后,使用阻塞赋值语句 `reset = 0;` 将复位信号置为 0,以便下一次计数。
verilog阻塞和非阻塞
在 Verilog 中,阻塞和非阻塞是用于描述赋值语句的两种不同方式。阻塞赋值使用“=”符号,而非阻塞赋值使用“<=”符号。
阻塞赋值会在执行完当前语句之前阻止执行下一条语句,而非阻塞赋值则不会。这意味着,在使用阻塞赋值时,必须等待当前语句执行完毕后才能执行下一条语句,而在使用非阻塞赋值时,可以同时执行多个语句。
下面是一个使用阻塞赋值的例子:
```
always @(posedge clk) begin
a = b;
c = a;
end
```
在这个例子中,第二条语句必须等待第一条语句执行完毕后才能执行,因为它们都使用了阻塞赋值。
下面是一个使用非阻塞赋值的例子:
```
always @(posedge clk) begin
a <= b;
c <= a;
end
```
在这个例子中,第二条语句可以立即执行,因为它使用了非阻塞赋值。