假设我有一些逻辑依赖于三个信号a
,b
和c
来分配变量d
。
如果我知道a
和b
和c
在逻辑上是合理的(如 I 知道的那样,则该工具不一定能够指出)将是互斥的,那么在综合结果方面会更快些?
此:
always @(posedge clk) begin
if (a) begin
d <= foo;
end
if (b) begin
d <= bar;
end
if (c) begin
d <= fizz;
end
end
或者这个:
always @(posedge clk) begin
if (c) begin
d <= fizz;
end else if (b) begin
d <= bar;
end else if (a) begin
d <= foo;
end
end
我认为前者是因为嵌套较少,因为没有检查,然后检查,然后检查。但我之所以说后者,是因为如果一个条件首先评估,则无需考虑其他条件的结果。但是也许我弄错了什么,错过了什么。
提前谢谢!
答案 0 :(得分:0)
对于条件检查,大多数综合工具都可能会根据您的结构为两者创建相同的逻辑,第一种情况是a-> b-> c,第二种情况是c-> b-> a。
话虽如此...
任何需要研究的人都可能不知道逻辑的排他性,如果这些条件检查是通过某些外部信号控制的,则可能导致他们错误地控制逻辑。从需要真正检查代码的角度来看,这也很难读懂。 if / else清楚地区分“ if if else,则这样做”,并且在结果方面没有歧义。在查看您的操作及其匹配方式之前,我必须先查看if的顺序。
由于我们在谈论逻辑速度,因此我们也可以讨论模拟器速度。在第一个结构上,您现在正在让模拟器执行3 if检查。第二个可能低至1,最高可能是3。虽然如果您使用较小的sim卡,则看不到这种影响性能;如果这是在快速时钟上多次实例化的某种逻辑,它将开始吃光模拟循环。
答案 1 :(得分:0)
这两个代码段将导致优先级复用。唯一的区别是,优先级的顺序由您/综合工具分别在第二/第一段代码中确定。
但是,如果您要针对FPGA编写此代码,则可以使用以下类似的代码将互斥部分嵌入代码中
always@(*)
begin
case ( {a,b,c} )
3'b000: d_in <= d;
3'b001: d_in <= foo;
3'b010: d_in <= bar;
3'b100: d_in <= fizz;
endcase
end
always@(posedge clk)
begin
d<=d_in;
end
关于, 巴拉德瓦(Bharadwaj)