在verilog中赋值失败, 不知道是什么原因, 求大神帮我看看, 谢谢先.

在我的下面这个module里,我用c来测j的变化,用d来测state的变化, 但是我用testbench仿真后, 可得到只有state变化了,而j没有被赋上值,我不知道为什么, 求大神求点迷津,谢谢.
module try (clk, rst, c, d);
input wire clk;
input wire rst;
reg [1:0] state;
output reg [1:0] d;
reg [3:0] j;
output reg [3:0] c;

always@(posedge clk or negedge rst) begin
if(!rst) begin
j <= 4'd0;
c = j;
state <= 0;
d = state;
end
else begin
if (j < 2) begin
if (state < 4) begin
state <= state + 1;
d = state;
end
else begin
if (state == 4) begin
j <= j + 1;
c = j;
state <= 0;
d = state;
end
end
end
end
end
endmodule

下面是我的testbench:

`timescale 1ns/100ps
module testbench1 ();

reg clk;
reg rst;
wire [3:0] c;
wire [1:0] d;

try DUT (
.clk(clk),
.rst(rst),
.c(c),
.d(d)
);

initial begin
clk <= 0;
rst <= 0;
#1
rst <= 1;
#5
clk <= 1; // S = 00
#5
clk <= 0;
#5
clk <= 1; // S = 01
#5
clk <= 0;
#5
clk <= 1; // S = 10
#5
clk <= 0;
#5
clk <= 1; // S = 11
#5
clk <= 0;
#5
clk <= 1; // S = 00
#5
clk <= 0;
#5
clk <= 1; // S = 01
#5
clk <= 0;
#5
clk <= 1; // S = 10
#5
clk <= 0;
#5
clk <= 1; // S = 11
#5
clk <= 0;

end

endmodule

谢谢!

提两个建议,第一个是谨慎使用阻塞赋值,你可以使用非阻塞赋值,一样可以查看到一个变量随着另一个变量的变化,只不过延后了一个CLK周期而已;第二个是触发条件是clk上升沿和RST下降沿,仿真时不要把时序写的那么紧,完全可以让rst保持低电平的时间长一些,作为程序复位的仿真时序图会方便看一些;具体的LZ慢慢调试,可以把你的程序和testbench同时做简化,另外查看下仿真工具的message里有没有警告和错误追问

你好, 谢谢你的回复, 我想问一下, 我怎么才可以让rst保持低电平的时间长一些呢? 不好意思啊,我才学verilog

追答

initial begin
clk <= 0;
rst <= 0;
#1
rst <= 1;
#5
clk <= 1; // S = 00
#5上面是你写的仿真动作,\你的RST信号只拉低了1ns clk的上升沿在6ns后第一次来到

追问

谢谢你,
那应该 多少ns就不会算是紧呢?
我照你说的, 我全使用非阻塞后, 我得到了j = 0. 但是j 从此之后没再变化, 我想要的是, 当state变化四次后, j 加1. 但是现在没有达到这个效果, 你知道是为什么吗?

追答

问题应该在你的always块里面 你的state和j初值都是0,但是你的state定义的是2bit的,所以state==4这个判断条件永远不会满足 j就不会执行+1操作

追问

太谢谢你了! 谢谢

温馨提示:答案为网友推荐,仅供参考
相似回答