module light(input clk,
input en,
output reg this_en,
output reg this_en_pose);
always@(*)
begin
if (clk == 0)
this_en = en;
else
this_en = this_en;
end
always@(posedge clk)
begin
this_en_pose<=en;
end
endmodule
`timescale 1ns / 1ps
module uut();
reg clk;
reg en;
wire this_en;
wire this_en_pose;
wire out_en;
wire out_en_pose;
light uu(
.clk(clk),
.en(en),
.this_en(this_en),
.this_en_pose(this_en_pose)
);
assign out_en=clk&this_en;
assign out_en_pose=clk&this_en_pose;
initial begin
clk = 0;
while(1)begin
#2
clk = ~clk;
end
end
initial begin
en = 0;
while(1)begin
#1
en = 1;
#4
en = 0;
#5
en=1;
#1
en=0;
#2
en=1;
#3
en=0;
end
end
endmodule
出现了毛刺,原因是由于clk和this_en_pose同时反转产生了竞争
竞争冒险的原因
门电路两个输入信号同时向相反的逻辑电平跳变(一个从0变为1,一个从1变为0)的现象就叫做竞争。
一个是其它说法:在组合逻辑电路中,某个输入变量通过两条或两条以上的途径传到输出端,由于每条途径延迟时间不同,到达输出门的时间就有先有后,这种现象称为竞争
其实这两个概念都对,因为第一个概念针对的是竞争冒险的适用(经常出现的)情况,第二个是竞争冒险产生的根本原因。