• FPGA编程基础(二)--经常使用行为仿真描写叙述


    1、经常使用的行为仿真描写叙述语句

    利用循环完毕遍历

    for、while语句经常使用于完毕遍历測试。当设计代码包括了多个工作模式。那么就须要对各种模式都机型遍历測试,假设手动完毕每种模式的測试,则将造成很大的工作量。

    利用for循环,通过循环下标来传递各种模式的配置。不仅能够有效降低工作量,还能保证验证的完备性。不会漏掉不论什么一种模式。

    (1) for循环仿真

    可综合文件:

    module signedMul(
    		input clk,
    		input rstn,
    		input [7:0] a,
    		input [7:0] b,
    		output [15:0] q
        );
        
         reg signed[7:0] ra;
         reg signed[7:0] rb;
        
        always @(posedge clk or negedge rstn) begin
        		if(~rstn) begin
        			ra <= 0;
        			rb <= 0;
        		end
        		else begin
        			ra <= a;
        			rb <= b;
        		end
        end
    		assign q = ra * rb;
    
    endmodule
    激励文件:

    module tb_sigendMul;
    
    	// Inputs
    	reg clk;
    	reg rstn;
    	reg [7:0] a;
    	reg [7:0] b;
    
    	// Outputs
    	wire [15:0] q;
    
    	// Instantiate the Unit Under Test (UUT)
    	signedMul uut (
    		.clk(clk), 
    		.rstn(rstn), 
    		.a(a), 
    		.b(b), 
    		.q(q)
    	);
    	
    	//循环參数
    	parameter mod_num = 5;
    	integer i;
    	
    	
    	initial begin
    		forever #10 clk = ~clk;
    	end
    	initial begin
    		// Initialize Inputs
    		clk = 0;
    		rstn = 0;
    		a = 0;
    		b = 0;
    		#20 rstn = 1; //使能
    		for(i=0;i<(mod_num-1);i= i +1)
    		begin
    			case(i)
    				0:begin
    					#20;
    					a = 2;
    					b = -2;
    				end
    				
    				1:begin
    					#20;
    					a = 5;
    					b = 127;
    				end
    				
    				2:begin
    					#20;
    					a = -127;
    					b = -2;
    				end
    				
    				3:begin
    					#20;
    					a = 100;
    					b = 5;
    				end
    				
    				4:begin
    					#20;
    					a = 0;
    					b = -1;
    				end
    			endcase
    		end
    		
            
    		// Add stimulus here
    
    	end
          
    endmodule


    (2) 循环语句的异常处理

    通常,循环语句都会有一个“正常”的出口,比方当循环次数达到了循环计数器所指定的次数或while表示式不再为真。然后。使用disable语句可以退出不论什么循环,可以终止不论什么begin....end块的运行,从紧接这个块的下一条语句继续运行。

    disable语句的典型演示样例

    (3) wait语句

    wait语句是一种不可综合的电平触发事件控制语句,有例如以下两种形式:

    (1) wait(条件表达式) 语句/语句块;

    (2) wait(条件表达式);

    对于第一种形式,语句块能够是串行块(begin...end)或并行块(fork...join)。当条件表达式为真再開始运行。比如:

    在另外一种形式中,没有包括运行的语句块。

    当仿真运行到wait语句的运行,仿真进程继续往下进行,假设wait条件表达式不为真,则仿真进程进入等待状态,直到条件表达式为真。

    激励文件:

    module tb_wait;
    	reg [7:0] q0_out;
    	reg	flag;
    	
    	//initial初始化语句块1
    	initial begin
    		flag = 0;
    		#100 flag = 1;
    		#100 flag = 0;
    	end
    	
    	//initial初始化语句块2
    	initial begin
    		q0_out = 0;
    		wait(flag == 1) begin //wait语句
    			q0_out = 100;
    			#100;
    		end
    		q0_out = 255;
    
    	end    
    endmodule


    (3) TASK和FUNCTION语句

    task语句和function语句在仿真程序中发挥了最大优势,能够将固定操作封装起来,配合延时控制语句,可精确模拟大多数经常使用的功能模块。具备良好的可重用性。

    例:完毕平方操作

      module tb_tri;
          parameter bsize = 8;
          parameter clk_period = 2;
          parameter cac_delay = 6;
          reg  [(bsize-1):0] din;
          reg  [(2*bsize-1):0] dout;
          
          //定义完毕3次方运算的task
          task tri_demo;
          	input signed [(bsize - 1):0] din;
          	output signed [(2*bsize-1):0] dout;
          	#cac_delay dout = din*din;
          endtask
          
          //在串行语句块中调用完毕3次运算的task
          initial begin
          	din = 0;
          end
          
          always #clk_period begin
          	din = din - 10;
          	//任务调用语句
          	tri_demo(din,dout);
          end
          
      endmodule














  • 相关阅读:
    201301 JAVA题目0-1级, 华为笔试题
    病毒传播, 美团笔试题
    OC基础 字符串
    IOS OC语言基础(一)类的创建
    pyautogui 鼠标精灵模拟登陆
    ajax hook注入
    aiohttp异步请求
    IOS自学教程大全
    提高python工具包
    Kafka与Flume区别
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7201130.html
Copyright © 2020-2023  润新知