首先分配,然后在 if 块中重新分配,以替代 Verilog 中的 if-(else if)-else
First assign and then reassign in if block as alternative to if-(else if)-else in Verilog
是不是先给一个变量赋值,然后在 if 块中重新赋值,而不是使用 if-(else if)-else 块,如果 if 和 else 块中的赋值相同,而在else if 块是不同的赋值。
always @(*) begin
if condition1 begin
var = val1;
end
else if condition2 begin
var = val2;
end
else begin
var = val1;
end
end
对
always @(*) begin
var = val1;
if condition2 begin
var = val2;
end
end
鉴于 condition1 和 condition2 是互斥的,我认为这两个块应该综合相同的逻辑,选择一个而不是另一个纯粹是美学上的。我的想法是否正确,或者一种实现的综合方式与另一种不同?如果我的想法是正确的,社区更喜欢哪种方法?
编辑:在 racraman 的评论后添加了相互排斥的条件。
在使用 always@(*) 块时,您可能最终会在设计中推断出无意的闩锁。
对于您提到的类型的赋值,最好使用三元运算符。
assign var = (cond1)?(val1):(cond2)?(val2):(val1);
//Assuming cond1 and cond2 are mutually exclusive
如果cond1和cond2可以同时出现那么上面的assign可以改成
assign var = (cond1 && cond2)?(val1):(cond1)?(val1):(cond2)?(val2):(val1);
//Assuming val1 when both cond1/2 are high
至于你问的一般原则:走哪条路都无所谓。合成器将足够聪明,无论如何都能解决这个问题。对于模拟,首先执行默认分配的选项可能执行得更慢(特别是如果分配是 non-blocking ),但我不会担心它。
就个人而言,我更喜欢第二种,因为对于偶然的人来说更明显 reader 你已经涵盖了生成不需要的闩锁的基础(换句话说,你总是分配给 var
).
话虽如此,您的示例(原则上)非常简单,在这种特殊情况下,很明显需要多路复用器,您可能根本不需要 always 块,应该只使用带有三元运算符的 assign
。
我说'in principle'是因为你的逻辑不通。你说你的条件是相互排斥的,但如果两个条件都不活跃会怎样?您真的需要一个锁存器来 保留 之前的输出吗?如果不是,为什么你有两个条件?
是不是先给一个变量赋值,然后在 if 块中重新赋值,而不是使用 if-(else if)-else 块,如果 if 和 else 块中的赋值相同,而在else if 块是不同的赋值。
always @(*) begin
if condition1 begin
var = val1;
end
else if condition2 begin
var = val2;
end
else begin
var = val1;
end
end
对
always @(*) begin
var = val1;
if condition2 begin
var = val2;
end
end
鉴于 condition1 和 condition2 是互斥的,我认为这两个块应该综合相同的逻辑,选择一个而不是另一个纯粹是美学上的。我的想法是否正确,或者一种实现的综合方式与另一种不同?如果我的想法是正确的,社区更喜欢哪种方法?
编辑:在 racraman 的评论后添加了相互排斥的条件。
在使用 always@(*) 块时,您可能最终会在设计中推断出无意的闩锁。 对于您提到的类型的赋值,最好使用三元运算符。
assign var = (cond1)?(val1):(cond2)?(val2):(val1);
//Assuming cond1 and cond2 are mutually exclusive
如果cond1和cond2可以同时出现那么上面的assign可以改成
assign var = (cond1 && cond2)?(val1):(cond1)?(val1):(cond2)?(val2):(val1);
//Assuming val1 when both cond1/2 are high
至于你问的一般原则:走哪条路都无所谓。合成器将足够聪明,无论如何都能解决这个问题。对于模拟,首先执行默认分配的选项可能执行得更慢(特别是如果分配是 non-blocking ),但我不会担心它。
就个人而言,我更喜欢第二种,因为对于偶然的人来说更明显 reader 你已经涵盖了生成不需要的闩锁的基础(换句话说,你总是分配给 var
).
话虽如此,您的示例(原则上)非常简单,在这种特殊情况下,很明显需要多路复用器,您可能根本不需要 always 块,应该只使用带有三元运算符的 assign
。
我说'in principle'是因为你的逻辑不通。你说你的条件是相互排斥的,但如果两个条件都不活跃会怎样?您真的需要一个锁存器来 保留 之前的输出吗?如果不是,为什么你有两个条件?