具有2个复位的D触发器:合成错误

时间:2016-03-11 14:26:24

标签: verilog synthesis register-transfer-level

我正在合成一个数字模块,我需要一个带有2个异步复位的D-Flip-Flop。 (原因是我将使用可用时钟驱动一次复位,我将使用第二次复位我的数字模块的所有寄存器) 我准备了以下代码:

module dff_2rst(q,qn,clk,d, rst,clear);
    input  clk,d, rst, clear ;
    output q,qn;
    reg q,qn;
    always @(posedge clk or posedge rst or posedge clear)    //asynchronous reset    
    begin 
    (* full_case, parallel_case *)  
    case({rst, clear})  
        2'b00: begin 
                q <= d; 
                qn<=~d;
               end
        default: begin     
                    q <= 1'b0;  
                    qn <=1'b1;
                end 
    endcase
    end



endmodule     

但是我收到以下错误:

The statements in this 'always' block are outside the scope of the synthesis policy. Only an 'if' statement is allowed at the top level in this always block. (ELAB-302)
*** Presto compilation terminated with 1 errors. ***

我也试过

if(~rst & ~clear)

但我也有错误。

您是否有想法更正我的代码?非常感谢!

2 个答案:

答案 0 :(得分:1)

在Verilog RTL中编写异步复位,设置(清除)触发器的标准方法是:

always @(posedge clk or posedge rst or posedge clear) begin
  if (rst) begin
    // Aysnc Reset
    q <= 'b0 ;
  end
  else if (clear) begin
    // Async Clear 
    q <= 'b0 ;
  end
  else begin
    // Sync logic here
    q <= d;
  end
end

assign qn = ~n;

qn的小技巧要求它是一根导线,目前定义为一个寄存器。 reg q,qn;应为reg q;

对于更干净的代码,新的标题类型更清晰,避免重复:

module dff_2rst(
    input      clk,
    input      d,
    input      rst,
    input      clear,
    output reg q,
    output     qn );

答案 1 :(得分:0)

谢谢你,摩根。你的代码对我很有启发。我无法使用

assign qn=~q; 

因为我收到了错误:

qn is not a valid left-hand side of a continuous assignment.

但是我以下面的方式修改了你的代码并且它有效:

module dff_2rst(q,qn,clk,d, rst,clear);
    input  clk,d, rst, clear ;
    output q,qn;
    reg q,qn;
    always @(posedge clk or posedge rst or posedge clear)    //asynchronous reset    
//
    begin
        if (rst) begin
         // Aysnc Reset
            q <= 'b0 ; 
            qn<= 'b1 ;   
        end
        else if (clear) begin
        // Async Clear 
            q <= 'b0 ;
            qn<= 'b1 ;
        end
        else begin
        // Sync logic here
            q <= d;
            qn<= ~d;
        end
    end
endmodule