Verilog 2复位D触发器:合成错误

Verilog 2复位D触发器:合成错误,verilog,synthesis,register-transfer-level,Verilog,Synthesis,Register Transfer Level,我正在做一个数字块的合成,我需要一个带2个异步复位的D触发器。 (原因是我将使用一个可用时钟驱动一个重置,并使用第二个重置来重置我的数字块的所有寄存器) 我编写了以下代码: 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)

我正在做一个数字块的合成,我需要一个带2个异步复位的D触发器。 (原因是我将使用一个可用时钟驱动一个重置,并使用第二个重置来重置我的数字块的所有寄存器) 我编写了以下代码:

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     
我也试过了

if(~rst & ~clear)
但我也有错误


你有办法更正我的代码吗?非常感谢

在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;

谢谢你,摩根。你的代码鼓舞了我。我不能用它

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
模块dff_2rst(q、qn、clk、d、rst、clear);
输入时钟、d、rst、清除;
输出q,qn;
reg q,qn;
始终@(posedge clk或posedge rst或posedge clear)//异步重置
//
开始
如果(rst)开始
//Aysnc复位

q不定义为reg,保留为导线。
reg q,qn
应该是
reg q我尝试过,但是我得到了错误
分配到'qn'需要它是一个寄存器。(VER-952)
@Morgan,我明白了:我只使用
reg q如果我将您的代码与
分配一起使用
。我可以问你为什么它比我的版本好吗?简单地说,更少的代码行意味着更容易维护,更少的bug。通过一个简单的倒置,它可以防止您在三种情况中的任何一种情况下输入错误。
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