一、问题
波形高度异常,忽高忽低,正常波形高电平和低电平是统一高度的

`timescale 1ns/1ns
module key_test_tb();
//parameter define
parameter CLK_PERIOD = 20;
parameter CNT_MAX = 25'd25; //仅用于仿真,对应 500ns
reg sys_clk; //周期 20ns
reg  d;
wire  q;
wire p;
wire n;
//信号初始化
//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
//例化待测设计
double_edge inst_double_edge(
.clk 		(sys_clk 	),
.d 		(d 		),
.q		(q		),
.p		(p		),
.n		(n		)
);
initial begin
sys_clk <= 1'b0;
d <= 0;
#(CLK_PERIOD*10)
d <= 1 ;
#(10);
d <= 0 ;
#(30);
d <= 1 ;
#(20);
d <= 1 ;
#(10);
d <= 0;
#(20);
d <= 1;
#(30);
d <= 0;
end
endmodule
module double_edge (
    input clk,
    input d,
    output q,
    output reg p,
    output reg n
);
always@(posedge clk)begin
	p <=  q;
end
always@(negedge clk)begin
	n <=  d;
end
assign q = clk ? p : n;
endmodule
二、原因
在进行ModelSim波形仿真时,由于p和n的初始值是未定义的,所以它们的波形值显示为x,表示未确定的值,并且p的x态传递给q,p就被交替赋值为0,x,1,所以出现波形错乱。
always@(posedge clk)begin
		p <=  q;
 end
x态:表示Unknown,仿真发生了不能解决的逻辑冲突。
 出现状态x的原因:
- 未初始化信号:当你在模块中定义信号但没有明确初始化它们时,它们的值会被默认设置为 ‘x’。
- 冒险行为:在 Verilog 中,如果存在冒险行为(比如设置一个寄存器和读取它的值的操作之间的延迟很小),可能导致信号值为 ‘x’。
赋初值后波形中的x状态消失
module double_edge (
    input clk,
    input d,
    output q,
    output reg p = 0,
    output reg n = 0
);
always@(posedge clk)begin
	p <=  q;
end
always@(negedge clk)begin
	n <=  d;
end
assign q = clk ? p : n;
endmodule


 



















