【发布时间】:2013-11-17 21:28:50
【问题描述】:
我正在编写一个用于合成算法的 Verilog 代码,我对哪些情况可能导致推断出锁存器感到有些困惑。下面是一段这样的代码,虽然它在模拟中运行良好,但我担心它可能会导致硬件问题。
always@(b1 or b2)
.....
// b1_map,b2_map,m1_map & m2_map are derived from combinational functions using b1 & b2
.....
if(b1_map<=20 && m2_map<=20 && b1_map>=0 && m2_map>=0)
begin
accumulator1[b1_map][m2_map]= accumulator1[b1_map][m2_map] + 1;
end
if(b2_map<=20 && m2_map<=20 && b2_map>=0 && m2_map>=0)
begin
accumulator2[b2_map][m2_map]= accumulator2[b2_map][m2_map] + 1;
end
//accumulator1 & accumulator2 are 2d registers mapped like 2d arrays
因此,在这种情况下,我希望仅在数据处于指定范围内时才映射数据。是否会因为没有定义“其他”场景而推断出闩锁?我没有添加 else 语句,因为如果数据不在限制范围内,我不想对它做任何事情。
【问题讨论】:
-
这对我有什么帮助?我希望这个块只在“b1”和“b2”数据存在时运行,这只会在程序的后面发生。
-
您的代码看起来会生成大量锁存器,并且可能会导致时序收敛等问题。看起来您基本上是在对同一位置执行内存读取和写入操作。这更适合在同步的 always @(posedge clk) 块中实现。是否有一个非常令人信服的理由必须是异步的?
-
用于将值映射到内存寄存器的数据“b1”和“b2”并不总是可用的(每500~600ps可用一次)。所以,我认为如果我在单独的“always(b1 or b2)”块中使用它会更好。
-
你似乎有一个根本的误解。综合创造硬件。您不会“运行”硬件,它总是在那里做某事。说信号“不总是可用”是没有意义的,因为信号总是存在于硬件中并且具有一定的价值。您需要告诉合成器您希望硬件在所有可能的条件下做什么,否则它会做出(可能不正确的)假设。