我正在测试一个8位寄存器的模块,与我的其余代码分开。我使用ModelSim设置值,然后运行以查看结果。 该模块应具有二进制数输入,清除位,使能位和输出。
module Register8bit(D, Clk, Clear, Enable, OutNum);
input [7:0] D; //8 bit binary data
input Clk; //Clock
input Clear; //Clear bit
input Enable; //Enable bit
output reg [7:0] OutNum;
always @(posedge Clk)
begin
if (Enable)
begin
if (Clear)
OutNum <= 8'b00000000;
else
OutNum <= D;
end
end
endmodule
这是我期望的输出(按此顺序),D = 10001111,Clk = 1.
Steps CLR Enable OutNum
1 0 0 xxxxxxxx (initially undefined)
2 0 1 10001111 (input data is used)
3 1 0 10001111 (because write-protection)
4 1 1 00000000 (Clear and Enable are true, so set to 0)
5 0 1 10001111 (Clear is false and Enable is true, so use input data)
第一步有效,但第二步没有(因此其他人也不会工作)。具体来说,OutNum在第二步保持未定义。如果Enable为true,则使用输入数据更新OutNum在第一步中可以正常工作。
我该如何修复这个模块?
测试台代码:
`timescale 1ns / 1ps
module test_register;
//inputs
reg [7:0] D;
reg Clk;
reg Clear;
reg Enable;
//outputs
reg [7:0] OutNum;
//instantiate
Register8bit uut(
.D(D),
.Clk(Clk),
.Clear(Clear),
.Enable(Enable)
);
initial begin
D = 10001111;
Clk = 1;
//step 1
#100;
Clear = 0;
Enable = 0;
#100;
//step 2
Clear = 0;
Enable = 1;
#100;
//step 3
Clear = 1;
Enable = 0;
#100;
//step 4
Clear = 1;
Enable = 1;
#100;
//step 5
Clear = 0;
Enable = 1;
#100;
end
endmodule
答案 0 :(得分:1)
您需要多次切换subscribe(SingleObserver)
信号。您的代码只是将其设置为1,然后将其保留为1以用于整个SIM卡。
Clk