always块内if条件语句的规则

Quartus需要根据always块内的if语句来判断同步时钟信号和异步控制信号,例如:

always @ (posedge clk or posedge rst1 or posedge rst2) begin
   if ( rst1 || rst2 )
      q <= 1'b0;
   else
      q <= d;
end

以上代码段是一个具有3个敏感事件的always块,敏感事件包含2个异步重置信号和1个时钟信号。Quartus通过if语句找到2个异步信号,进而推测出剩余的1个是同步时钟信号。

  • 必须有一个if或else if完全是敏感事件表里的异步信号,不包含其他内容。
  • if语句内的条件必须与触发边沿相符,posedge xxx用if(xxx),negedge xxx_n用if(!xxx_n)。
    这是一个错误的示例:
always @ (posedge clk or posedge rst) begin
   if ( rst || sync_rst )
      q <= 1'b0;
   else
      q <= d;
end

Quartus无法在敏感时间表里匹配到“sync_rst ”这个信号,应该拆开写成以下形式:

always @ (posedge clk or posedge rst) begin
   if (rst)
      q <= 1'b0;
   else if (sync_rst)
      q <= 1'b0;
   else
      q <= d;
end

你可能感兴趣的:(always块内if条件语句的规则)