gpt4 book ai didi

Verilog 分块分配

转载 作者:行者123 更新时间:2023-12-02 21:03:17 25 4
gpt4 key购买 nike

我对 Verilog 有点陌生。我知道在时钟进程中我们应该使用非阻塞分配,而在非时钟进程中我们使用阻塞分配。

当我阅读别人的代码时,我遇到了这段代码。

reg iowrb_int,iowrb_met;
reg iordb_int,iordb_met;
always@(*)
begin
iowrb_int <= iowrb_met;
iordb_int <= iordb_met;

iowrb_met <= iowr_bar;
iordb_met <= iord_bar;
end

我真的不确定上面的代码!我认为它没有进行任何注册,对吗?在always@(*) 语句中使用非阻塞意味着什么吗?

在always@(*)语句中使用阻塞与非阻塞有什么区别吗?

最佳答案

主要区别是:

  • 阻塞赋值在下一个赋值之前执行,即它会阻塞下一个语句的执行。
  • 非阻塞赋值并行执行,即它们不会阻止其后面的语句的执行。

假设 a = 2 且 b = 3,则为非阻塞赋值:

a <= 4;
b <= a;

结果 a = 4 和 b = 2 - 赋值前 a 的值

但是

a = 4;
b = a;

将导致 a=4 和 b=4 - 阻塞分配完成后 a 的值。

变量被合成到寄存器(锁存器或触发器)与组合逻辑取决于always block 的敏感度列表。它不依赖于阻塞或非阻塞赋值的使用。

例如:

always @(*) begin
if (enable)
q = d;
end

这将导致 D 锁存器,因为当enable==0 时未指定对 q 的分配,因此需要记住这是最后一次分配。

同时

always @(*) begin
if (enable)
q = d;
else
q = f;
end

这将导致多路复用器(组合逻辑),因为对 q 的分配是为两种启用情况指定的,因此 q 不需要记住任何内容。

关于Verilog 分块分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22565475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com