爵士
我对always
块内的循环有一些疑问。请澄清我。所有迭代都在单个时钟周期完成?当for
在for
块内的另一个always
循环内循环时会发生什么?
请帮我在以下程序中找到错误。谢谢你
reg [5:0] c;
reg [2:0] m;
reg G[5:0][2:0] = {{1'b1,1'b0,1'b0},{1'b0,1'b1,1'b0},{1'b0,1'b0,1'b1}, {1'b1,1'b1,1'b0},{1'b0,1'b1,1'b1},{1'b1,1'b0,1'b1}};
integer i;
integer j;
always @(posedge clk1)
begin
for(i=0;i<6;i=i+1)
begin
c[i]=0;
for(j=2;j>=0;j=j-1)
begin
c[i] <= c[i]^( m[j]&G[2-j][i]);
end
end
end
答案 0 :(得分:0)
将always
块看作是一些模拟一点硬件的软件。 灵敏度列表是一个触发器列表,当它们中的任何一个发生变化时,软件会执行以计算新输出应该是什么。
对于组合 always
块,所有输入都在灵敏度列表中(使用@(*)
构造),因此如果任何输入发生变化,那么一点点的输出硬件可能会改变(几乎是组合逻辑的定义)。因此,如果任何输入发生变化,软件会执行以计算来自那一点组合逻辑的新输出。
对于顺序 always
块,只有时钟和(如果存在)异步复位在灵敏度列表中,因为没有其他输入直接导致输出发生变化。因此,对于顺序块,如果时钟(或异步复位)发生变化,则软件执行以计算该少量顺序逻辑的新输出将是什么。
因此,在您的情况下,您有一个顺序always
块,而不是异步重置。它是一些软件,它模拟了一些顺序逻辑。只有时钟发生变化(如果clk1
上有上升沿),此顺序逻辑的输出才会改变。因此,如果clk1
上有上升沿,always
块内的代码将开始执行,以便计算数组c
的新值(您的输出)顺序逻辑,因为这是在此特定always
块中分配的变量。在这个特定代码中碰巧出现循环这一事实并不重要。如果clk1
上有上升沿,那么循环将完全执行(无需等待clk1
上的任何其他上升沿),以便计算c
的新值。