首页 > 解决方案 > 注册类型变量给出错误:未知类型

问题描述

我正在制作一个 1 位正沿 Dflipflop。只有在时钟信号的上升沿出现时,才应分配所有输出。Q 与 D 相同,Qbar 是 D 的否定。

当我将 Qbar 用作电线时,它会以某种方式起作用。

assign Qbar = ~Q;

在总是块之外。但是下面的原始代码给出了一个错误,即“=”附近的语法错误和“Qbar 是未知类型”

我试图使 Qbar 分配成为非阻塞类型,但它没有效果。

module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );
//assign Qbar = ~D;
always @(posedge clk)
     Q = D;
     Qbar = ~D; 
endmodule

我在这里想念什么?我是verilog的新手。

标签: verilogflip-flop

解决方案


您的错误消息是由于在 Verilog 中,如果您在 always 块中有多个语句(在其他地方也是如此),则它必须包含在begin-end构造中。所以,你需要这个:

module DFlipFlop(
    input D,
    input clk,
    output reg Qbar,
    output reg Q
    );

  always @(posedge clk) begin
     Q = D;
     Qbar = ~D; 
  end
endmodule

但是,这不是一个好的解决方案,因为

i)(除非您知道自己在做什么)始终对要在综合后变为触发器的变量使用非阻塞分配,并且

ii) 无论如何,使用wireandassign语句可能是一个更好的解决方案,因为(至少最初)如果你在一个时钟always块内分配两个单独的变量,你的合成器输出两个触发器 - 一个 forQ和一个 for Qbar

这是一个更好的解决方案:

module DFlipFlop(
    input D,
    input clk,
    output Qbar,
    output reg Q
    );

  always @(posedge clk)
     Q <= D;

  assign Qbar = ~Q;

endmodule

推荐阅读