标题:
数字电路设计之仿真小技巧
[打印本页]
作者:
look_w
时间:
2017-11-7 17:00
标题:
数字电路设计之仿真小技巧
1、在使用ISE仿真的时候,一般来说很多人只会串行输入数据的仿真,其实还可以进行并行的仿真:
举个例子:
用 fork-join 并行块产生信号波形。这里的意思就是N*cycle之后赋予的信号。
`timescale 10ns/1ns
module wave2;
reg wave;
parameter cycle=5;
initial
fork
wave=0;
#(cycle) wave=1;
#(2*cycle) wave=0;
#(3*cycle) wave=1;
#(4*cycle) wave=0;
#(5*cycle) wave=1;
#(6*cycle) $finish;
join
initial $monitor($time,,,"wave=%b",wave);
endmodule
2、一般对于信号递增的,我们采用的就是循环了。for循环:
举个栗子:
module no7_tb;
integer i = 0;
// Inputs
reg [3:0] a;
reg [3:0] b;
reg [1:0] opcode;
// Outputs
wire [3:0] out;
// Instantiate the Unit Under Test (UUT)
no7 uut (
.a(a),
.b(b),
.opcode(opcode),
.out(out)
);
initial begin
// Initialize Inputs
a = 4;
b = 3;
for(i=0;i<=3;i=i+1)
begin
opcode <= i;
#10;
end
$finish;
end
endmodule
3、对于有时钟的仿真,一定不要忘记了。parameter delay = 100;
always #(delay) CLK = ~CLK;//写成clk <=!clk;也是可以的。
4、一般在initial里面结束的时候加一个$finish,这样的话,就可以是使得仿真看起来更舒服。
5、出了看波形,采用monitor可以直接看信号的值。monitor就是你自己监视的信号发生变法的话就进行显示。有点像chipscope,只是chipscope用于板级仿真的时候。
6、其实还有后仿真,后仿真一般是modelsim和ISE联合仿真,具体怎么做,百度一下就有很多资料。
7、initial其实可以有很多个,对一些值赋初值不一定放到一个initial里。
8、串行仿真的例子:
`timescale 10ns/1ns
module wave1;
reg wave;
parameter cycle=10;
initial
begin
wave=0;
#(cycle/2) wave=1;
#(cycle/2) wave=0;
#(cycle/2) wave=1;
#(cycle/2) wave=0;
#(cycle/2) wave=1;
#(cycle/2) $finish ;
end
initial $monitor($time,,,"wave=%b", wave);
endmodule
以上这一段用循环就是一个不错的选择!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0