Verilog代码:输出故障



以下代码用于在导线S1和X被断言而导线S0被取消断言的情况下输出1。然而,当我运行波形时,输出始终为0。

控制导线的逻辑方程是:

S1=(S0&~X)|(S1&~20&X)

S0=X

O=(S1&S0)

我的代码有问题吗:

module Dff1(D, clk, Q, Qbar);
input D, clk;
output reg Q;
output Qbar;
initial begin
Q = 0;
end
assign Qbar = ~Q;
always @(posedge clk)
Q = D;
endmodule
module Mod1 (clk, X, O);
input clk, X;
output O;
wire S1, S0, Q1, Q0, Q1bar, Q0bar;
assign S1 = (S0 & ~X) | (S1 & ~S0 & X);
Dff1 C1(S1, clk, Q1, Q1bar);
assign S0 = X;
Dff1 C0(S0, clk, Q0, Q0bar);
assign O = (S1 & S0);
endmodule
module test_bench ();
wire clk;
reg osc;
reg [1:0] R;
reg Seqinput;
integer num;
initial begin
osc = 0;
num = 0;
Seqinput = 0;
end
initial begin
$dumpfile("dump.vcd");
$dumpvars;
#20000 $finish;
end
always begin
#10 osc = ~osc;
num = (num >= 7) // counter incremented by 1 from 0..7
? 0 : (num + 1);
if ((num % 2) == 0) begin // every other time step
R = $random % 2; // $random generates a 32-bit signed
                 // random number
                 // -1 <= $random % 2 <= 1
if (R > 0)
Seqinput = 1; // input is 1
else
Seqinput = 0; // input is 0
end
end
assign clk=osc;
wire Out1;
Mod1 Mod1instance(clk, Seqinput, Out1);
endmodule

用替换解释:

S1 = (S0 & ~X) | (S1 & ~S0 & X)      sub S0 with X
S1 = ((X) & ~X) | (S1 & ~(X) & X)    X & ~X == 0
S1 = ( 0 ) | ( S1 & 0 )              S1 & 0 == 0;
S1 = ( 0 ) | ( 0 )
S1 = 0

由于S1的分配取决于其当前值,因此它被认为是异步反馈逻辑。这通常是你不想做的事情。我相信你想要的真正等式是:

S1 = (Q0 & ~X) | (Q1 & ~Q0 & X)

这使得代码同步且可预测。Q1和Q0分别是S1和S0的先前时钟值。

此外,在分配(<=)触发器时使用非阻塞分配也是很重要的。Verilog是一个非威慑模拟器。这意味着计划在同一地区进行的操作可以按任何顺序进行。在失败时使用非阻塞会将分配移动到NBA区域,而其评估保持在活动区域中。

always @(posedge clk)
    Q <= D;

最新更新