数字电路设计之仿真小技巧

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


以上这一段用循环就是一个不错的选择!

你可能感兴趣的:(Digital,Chip,Design)