verilog语句中的always语句执行顺序问题
如果always语句块中的某个if语句中begin-end之间有两个或者两个以上的语句,那这些语句是顺序执行还是并行执行呢???例如:always@(posedgeclk...
如果always语句块中的某个if语句中begin-end之间有两个或者两个以上的语句,那这些语句是顺序执行还是并行执行呢???
例如:
always @(posedge clk or negedge rst_n)
begin
if(clk_bps)
begin
num <= num + 1'b1;
case(num)
4'd1: rx_temp_data[0] <= rs232_rx;
4'd2: rx_temp_data[1] <= rs232_rx;
....
default;
endcase
end
........
end
中的
begin
num <= num + 1'b1;
case(num)
4'd1: rx_temp_data[0] <= rs232_rx;
4'd2: rx_temp_data[1] <= rs232_rx;
....
default;
endcase
end
是并行执行还是顺序执行??case中的判定条件num取值是去加1b'1前的值还是之后的值呢? 展开
例如:
always @(posedge clk or negedge rst_n)
begin
if(clk_bps)
begin
num <= num + 1'b1;
case(num)
4'd1: rx_temp_data[0] <= rs232_rx;
4'd2: rx_temp_data[1] <= rs232_rx;
....
default;
endcase
end
........
end
中的
begin
num <= num + 1'b1;
case(num)
4'd1: rx_temp_data[0] <= rs232_rx;
4'd2: rx_temp_data[1] <= rs232_rx;
....
default;
endcase
end
是并行执行还是顺序执行??case中的判定条件num取值是去加1b'1前的值还是之后的值呢? 展开
3个回答
展开全部
举个例子当num==2,clk上升沿来了num要变成新值3,但是这个3要等到下一个clk上升沿到来才能赋给num,当前clk上升沿num值仍然保持为2,所以case中的判定条件num取值是加1前的!
追问
有个问题需要探讨下:
我觉得是这样的:以你的例子为例,当num==2,clk上升沿来了num值加1变成新值3,但由于使用了非阻塞赋值语句,所以num加1语句和case块语句成为并行执行,故case(num)中的num的值还是加1前的值2;而这个clk上升沿结束后num值已经加1变成3了,即下一个clk上升沿到来之前寄存器num锁存值3,因为当下一个clk上升沿到来时,电路立刻对num值进行操作了。您看看是不是有问题~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询