gpt4 book ai didi

verilog - 在verilog中按顺序或同时执行

转载 作者:行者123 更新时间:2023-12-03 23:23:40 34 4
gpt4 key购买 nike

我是verilog的新手,发现verilog的执行很棘手。在verilog程序中执行是如何发生的。假设我有 2 个模块和一个测试台-

module module1(clock,A,B,C);
input A,B,clock;
output C;
assign c=A+B;
endmodule

module module2(clock,A,B,C);
input A,B,clock;
output C;

assign C=A-B;

endmodule

module testbench;
reg A,B,clock;
wire C;
module1 m1(clock,A,B,C);
module2 m2(clock,A,B,C);
initial
clock=1'b0;
always
#4 clock=~clock;
endmodule

我知道所有初始 block 都从时间 0 开始。但是这些初始 block 是按顺序执行的,即如果初始 block 有多行,它们都是按顺序执行还是同时执行。另外,模块是如何执行的?将 module1首先开始,因为它出现在 module2 之前在测试台中完全完成然后 module2启动或两者同时运行。当时钟在 4 秒后发生变化时会发生什么,如果时钟发生变化,模块运行会在这两者之间停止,还是会完成之前的执行,然后用新的时钟重新开始?

最佳答案

在 Verilog 中,实例化 一个模块的意思是添加 物理硬件到您的电路板。

模块只不过是可以工作的小型硬件 block 同期 .每个模块都可以有一些程序 block 、连续赋值语句或两者兼而有之。

程序 block 执行 同期 , 类似的适用于连续赋值语句。

我这样称呼:

Procedural  blocks: initial, always etc. blocks.
Continuous assignment: assign, force etc.

因此,无论您以什么顺序实例化模块,都将在 中工作。并行 .

这里出现了时间戳的概念。每个 时间戳 包含事件、非事件和 NBA 区域。引用这里的图:

Verilog Procedural Blocks

对于每个时间戳, 全部 实例已 checkin 每个地区 .如果要执行任何操作,比如说 module1然后它并行完成,其他模块让我们说 module2也被检查。如果模块之间存在一些依赖关系,那么它们是 再次执行 .

在这里,在您的示例中, c单线 , 和 输出 在这两个模块中,这会生成 赛跑状况模块之间,这当然不好。

思考硬件透视 .两个或更多不同的硬件模块可以有相同的输入,但 不能有相同的输出。所以,输出线 必须不同 .
module testbench; 
reg A,B,clock;
wire C1,C2; // different wires

module1 m1(clock,A,B,C1);
module2 m2(clock,A,B,C2);
initial clock=1'b0;
always #4 clock=~clock;
endmodule

另外,这里的模块是连续赋值的,所以有 没有时钟的影响。不,模块也在时钟之间运行。只是有 没有安排事件在那些时间戳中。

正如我们现在所知,所有程序 block 都是并行执行的。但是 程序 block 内的内容被执行 依次 .制作 中的内容并发 , fork..join使用构造。例如:
initial
begin
a<=0;
#5;
b<=1; // b is assigned at 5ns
end

initial
fork
a<=0;
#5;
b<=1; // b is assigned at 0ns
join

引用 Verilog Procedural Blocks , Concurrent and Sequential Statements网站了解更多信息。

关于verilog - 在verilog中按顺序或同时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33720391/

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