关于Verilog HDL中的的非阻塞赋值问题
时间:10-02
整理:3721RD
点击:
我是一个半路出家的FPGA应用工程师,这段时间在设计时序的时候突然发现一个矛盾的问题,希望能有人能帮忙解惑:
在一个always的同步时序逻辑里,比如有这样几句话:
always @(posedge clk_sys)
begin
......
Buffer[Reading_Index] < =Dout_From_FIFO ;
Reading_Index <= Reading_Index +1'b1 ;
......
end
Reading_Index 假如是一个4位的计数器,从0开始,那么在第一个clock上升沿结束的时候,是不是Buffer[0]被赋值,Reading_Index 从0变成1呢?如果我把这两句话颠倒一下,结果是不是变成Reading_Index 为1, Buffer[1]被赋值?
在一个always的同步时序逻辑里,比如有这样几句话:
always @(posedge clk_sys)
begin
......
Buffer[Reading_Index] < =Dout_From_FIFO ;
Reading_Index <= Reading_Index +1'b1 ;
......
end
Reading_Index 假如是一个4位的计数器,从0开始,那么在第一个clock上升沿结束的时候,是不是Buffer[0]被赋值,Reading_Index 从0变成1呢?如果我把这两句话颠倒一下,结果是不是变成Reading_Index 为1, Buffer[1]被赋值?
如果是<=这种赋值,就不会产生你所描述的现象,这种赋值方式,右边给左边是同时进行的,没有先后顺序。
的确如此
明白了,always内部的信号都是在某一个上沿之后改变,内部的赋值都是前一个时钟的结果。
但是 书上有一句话“在begin。end之间的语句是顺序执行的”, 一点不解。
……………………6^
<=符号是并行执行的
真正的硬件哪有顺序执行之说
顺序执行是指仿真的时候仿真软件如何执行,但无论如何,仿真软件的行为应该和硬件一致
嗯,楼上说得没错,这个顺序取决于仿真工具对同一个时间点执行事务的理解能力了。
赞同2楼说法!