|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 xiaocat85 于 2012-3-23 10:11 编辑
非常简单的加法运算,code和testbench如下:
module adder(a,b,en,clk,m,m_1,m_2);
input[3:0]a;
input[3:0]b;
input en;
input clk;
output [3:0] m;
output [3:0] m_1;
output [3:0] m_2;
wire [3:0] p;
assign p=a + b;
reg [3:0] m;
reg [3:0] m_1;
reg [3:0] m_2;
always@(posedge clk)
if(en==1'b1)
begin
m <= p;
m_2 <= a + b;
end
else
begin
m<=4'd0;
m_2<=4'd0;
end
always@(posedge clk)
m_1<=m;
endmodule
module adder_tb;
reg[3:0]a;
reg[3:0]b;
reg en;
reg clk;
wire[3:0] m;
wire[3:0] m_1;
wire[3:0] m_2;
adder u_adder_0(
.a(a),
.b(b),
.en(en),
.clk(clk),
.m(m),
.m_1(m_1),
.m_2(m_2));
always #1 clk=~clk;
initial begin
#0;
clk=1;
a=4'd3;
b=4'd2;
en=1'b0;
#10;
@(posedge clk)
en=1'b1;
#10;
@(posedge clk)
a=4'd5;
#10;
@(posedge clk)
b=4'd7;
#10;
@(posedge clk)
begin
a=4'd6;
b=4'd1;
end
#10;
@(posedge clk)
en=1'b0;
#20 $stop;
end
endmodule
在testbench中已经写明是“边沿对齐”。Modeslim中仿真波形如下:
MODELSIM1
m与m_2 波形一样,m_1被打一拍。
但是,在NC-verilog和ACTIVE-hdl这两个软件中,仿真结果却不一样:
NC
ACTIVE-HDL
NC与active-hdl的仿真波形一致,当a或者b在时钟边沿变化的时候,m_2比m要早一拍,m_2是a与b直接输入的,m只是用了一个wire变量p,综合后的电路应该是一样的,但为什么出现这样的结果呢?
不知道modelsim与NC/active-hdl的结果,谁更合理?对于直接输入的input跟经过wire后的input的默认延迟不一样吗,尝试修改NC中的延时模型,结果还是一样。另外在开源仿真器Icarus仿真的结果更诡异,
输入量都默认没有延迟?
IVERILOG
修改testbench,去掉“@(posedge clk)”:
module adder_tb;
reg[3:0]a;
reg[3:0]b;
reg en;
reg clk;
wire[3:0] m;
wire[3:0] m_1;
wire[3:0] m_2;
adder u_adder_0(
.a(a),
.b(b),
.en(en),
.clk(clk),
.m(m),
.m_1(m_1),
.m_2(m_2));
always #1 clk=~clk;
initial begin
#0;
clk=1;
a=4'd3;
b=4'd2;
en=1'b0;
#10;
en=1'b1;
#10;
a=4'd5;
#10;
b=4'd7;
#10;
a=4'd6;
b=4'd1;
#10;
en=1'b0;
#20 $stop;
end
endmodule
直接用时间对齐后,NC和ACTIVE-HDL的波形没有变,但modelsim的结果又发生变化了:
MODELSIM2
波形与上面的Icarus结果的一样了。
是软件中的设置有什么问题吗?到底怎么理解这些差异呢,虽然在实际中肯定会有延时。软件版本(modelsim:10.0d/6.5g NC:5.4-S020 ACTIVE-HDL:8.2-SP3 Icarus:0.9.5) |
|