这两个 verilog 语句是否等效,它们是否采用相同的循环?
Are these two verilog sentences equivalent, do they take the same cycles?
我想知道这两个代码是否会做同样的事情?它们之间的实际区别是什么?如果他们在做相同的操作,第二种情况是否比第一种情况快?
第一种情况,因为我要等到"cycle statement"出来才能识别"modi_varx_f"和"modi_vary_f"标志的上升,才能"activate" 在下一个循环中操作变量的增加,那么它比在第二种情况下立即执行要慢 "activate" 和 运行 在同一循环中的操作。
- 第一种情况:
always@(posedge clk or negedge rst) begin
if (~rst) begin
modi_varx_f = 0;
modi_vary_f = 0;
end
else if (cond1) begin
modi_varx_f = 1; // increase variable x on 1.
modi_vary_f = 1; // add 3'd6 to variable.
end
end
always@(posedge clk or negedge rst)
if (~rst)
varx = 0;
else if (modi_varx_f)
varx = varx + 1;
end
always@(posedge clk or negedge rst)
if (~rst)
vary = 0;
else if (modi_vary_f)
vary = vary + 3'd6;
end
- 第二种情况:
always@(posedge clk or negedge rst) begin
if (~rst) begin
varx = 0;
vary = 0;
end
else if (cond1) begin;
varx = vary + 1;
vary = vary + 3'd6;
end
end
只是为了总结评论流。通常,您可以将多个顺序的 always 块合并为一个而不会丢失功能。我猜你在第二个例子中犯了一个错误并使用了 varx = vary + 1;
而在第一个例子中你使用了 varx = varx + 1;
。这有所不同。
但是,如果第二个示例使用 varx
,那么两者是等价的。
由于您在示例中使用了顺序元素(带异步复位的触发器),根据行业惯例,您应该在那里使用非阻塞分配。折叠的正确答案应该是这样的:
always@(posedge clk or negedge rst) begin
if (~rst) begin
varx <= 0;
vary <= 0;
end
else if (cond1) begin;
varx <= varx + 1; // << varx
vary <= vary + 3'd6;
end
end
我想知道这两个代码是否会做同样的事情?它们之间的实际区别是什么?如果他们在做相同的操作,第二种情况是否比第一种情况快?
第一种情况,因为我要等到"cycle statement"出来才能识别"modi_varx_f"和"modi_vary_f"标志的上升,才能"activate" 在下一个循环中操作变量的增加,那么它比在第二种情况下立即执行要慢 "activate" 和 运行 在同一循环中的操作。
- 第一种情况:
always@(posedge clk or negedge rst) begin
if (~rst) begin
modi_varx_f = 0;
modi_vary_f = 0;
end
else if (cond1) begin
modi_varx_f = 1; // increase variable x on 1.
modi_vary_f = 1; // add 3'd6 to variable.
end
end
always@(posedge clk or negedge rst)
if (~rst)
varx = 0;
else if (modi_varx_f)
varx = varx + 1;
end
always@(posedge clk or negedge rst)
if (~rst)
vary = 0;
else if (modi_vary_f)
vary = vary + 3'd6;
end
- 第二种情况:
always@(posedge clk or negedge rst) begin
if (~rst) begin
varx = 0;
vary = 0;
end
else if (cond1) begin;
varx = vary + 1;
vary = vary + 3'd6;
end
end
只是为了总结评论流。通常,您可以将多个顺序的 always 块合并为一个而不会丢失功能。我猜你在第二个例子中犯了一个错误并使用了 varx = vary + 1;
而在第一个例子中你使用了 varx = varx + 1;
。这有所不同。
但是,如果第二个示例使用 varx
,那么两者是等价的。
由于您在示例中使用了顺序元素(带异步复位的触发器),根据行业惯例,您应该在那里使用非阻塞分配。折叠的正确答案应该是这样的:
always@(posedge clk or negedge rst) begin
if (~rst) begin
varx <= 0;
vary <= 0;
end
else if (cond1) begin;
varx <= varx + 1; // << varx
vary <= vary + 3'd6;
end
end