for loop in always posedge clock

时间:2017-01-04 10:03:46

标签: for-loop verilog

爵士 我对always块内的循环有一些疑问。请澄清我。所有迭代都在单个时钟周期完成?当forfor块内的另一个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

1 个答案:

答案 0 :(得分:0)

always块看作是一些模拟一点硬件的软件。 灵敏度列表是一个触发器列表,当它们中的任何一个发生变化时,软件会执行以计算新输出应该是什么。

对于组合 always块,所有输入都在灵敏度列表中(使用@(*)构造),因此如果任何输入发生变化,那么一点点的输出硬件可能会改变(几乎是组合逻辑的定义)。因此,如果任何输入发生变化,软件会执行以计算来自那一点组合逻辑的新输出。

对于顺序 always块,只有时钟和(如果存在)异步复位在灵敏度列表中,因为没有其他输入直接导致输出发生变化。因此,对于顺序块,如果时钟(或异步复位)发生变化,则软件执行以计算该少量顺序逻辑的新输出将是什么。

因此,在您的情况下,您有一个顺序always,而不是异步重置。它是一些软件,它模拟了一些顺序逻辑。只有时钟发生变化(如果clk1上有上升沿),此顺序逻辑的输出才会改变。因此,如果clk1上有上升沿,always块内的代码将开始执行,以便计算数组c的新值(您的输出)顺序逻辑,因为这是在此特定always块中分配的变量。在这个特定代码中碰巧出现循环这一事实并不重要。如果clk1上有上升沿,那么循环将完全执行(无需等待clk1上的任何其他上升沿),以便计算c的新值。