非法引用错误

时间:2013-02-20 14:53:07

标签: reference verilog hdl

我正在使用D-Flip Flops编写一个波纹计数器。但是,以下代码在Illegal reference error块内initialq2,q3,q4变量提供了module RCounter; reg d,d2,d3,d4,clk; wire q,q2,q3,q4; DFlipFlop a(d,q,clk); DFlipFlop a1(d2,q2,q); DFlipFlop a2(d3,q3,q2); DFlipFlop a3(d4,q4,q3); initial begin clk =1; d=0;d2=0;d3=0;d4=0;q2=0;q3=0;q4=0; #2 d=1;d2=~q2; d3=~q3; d4=~q4; #2 d=0;d2=~q2; d3=~q3; d4=~q4; #2 d=1;d2=~q2; d3=~q3; d4=~q4; #2 d=0;d2=~q2; d3=~q3; d4=~q4; #2 d=1;d2=~q2; d3=~q3; d4=~q4; #2 d=0;d2=~q2; d3=~q3; d4=~q4; #2 d=1;d2=~q2; d3=~q3; d4=~q4; end always begin #2 assign clk = ~ clk; end endmodule 。那是为什么?

module DFlipFlop(d,q,clk);

input d,clk;
output q;

assign q = clk?( (d==1)? 1:0) : q;

endmodule

D FlipFlop模块:

{{1}}

我该如何解决这个问题?

此致

2 个答案:

答案 0 :(得分:2)

正如Vlad Lazarenko指出的那样,您无法为initialalways@块内的电线分配值。

对此的修复只是将类型从wire更改为reg

如果您使用的是SystemVerilog,则将所有内容(三态总线除外)声明为logic

reg或wire的定义仅适用于该级别的层次结构。 reg可以驱动一个端口,该端口在该模块内被视为电线。

Reg并不意味着触发器或寄存器是模拟器优化。

值得注意的是,触发器通常通过以下方式实例化:

reg x;
always @(posedge clk or negedge rst_n) begin
  if(~rst_n) begin
    //reset condition
    x <= 1'b0;
  end
  else begin
    x <= next_value;
  end
end

答案 1 :(得分:0)

您正尝试将初始值分配给电线,此处:

q2=0;q3=0;q4=0;

这是非法的。