modelsim波形高度异常,值为X

一、问题

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

在这里插入图片描述

`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的原因:

  1. 未初始化信号:当你在模块中定义信号但没有明确初始化它们时,它们的值会被默认设置为 ‘x’。
  2. 冒险行为:在 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

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三、总结

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 07:04:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 07:04:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 07:04:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 07:04:03       18 阅读

热门阅读

  1. 【Leetcode】并查集/DFS/BFS多解

    2024-04-23 07:04:03       12 阅读
  2. Hive进阶(5)----yarn的资源调度策略

    2024-04-23 07:04:03       12 阅读
  3. OSPF的防止环路的机制

    2024-04-23 07:04:03       12 阅读
  4. 从C到Py:Python的字符串及正则表达式

    2024-04-23 07:04:03       12 阅读
  5. Golang学习笔记--Gin框架

    2024-04-23 07:04:03       14 阅读
  6. F5应用及配置

    2024-04-23 07:04:03       12 阅读