我正在使用D-Flip Flops编写一个波纹计数器。但是,以下代码在Illegal reference error
块内initial
为q2,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}}
我该如何解决这个问题?
此致
答案 0 :(得分:2)
正如Vlad Lazarenko指出的那样,您无法为initial
或always@
块内的电线分配值。
对此的修复只是将类型从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;
这是非法的。