VCS视频学习中的一个例子代码:dff.v和dff_tb.v

前言

VCS课程中的一个例子!

dff.v

//r/dff_exp.v 
 

 
module dff_exp(
	//Inputs
    input wire clk_i,
    input wire rst_l_i,
    input wire d,
	//Outputs
    output reg q
    );
	//........................................................
	//reg define area
	//........................................................
    reg q1;
	
	//........................................................
    //第一种实现方式 
	//........................................................	
    `ifdef DFF_STYLE1  
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i)
          q1 <= 1'b0;
        else
          q1 <= d;
    end
 
    always @(posedge clk_i, negedge rst_l_i) begin
        if(!rst_l_i)
          q <= 1'b0;
        else
          q <= q1;
    end
    `endif
	
	//........................................................
    //第二种实现方式
	//........................................................
   `ifdef DFF_STYLE2
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i)
          q1 = 1'b0;
        else
          q1 = d;
    end
 
    always @(posedge clk_i, negedge rst_l_i) begin
        if(!rst_l_i)
          q = 1'b0;
        else
          q = q1;
    end
    `endif
	
	 //第三种实现方式  
    `ifdef DFF_STYLE3  
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          q1 <= 1'b0;
          q <= 1'b0;
        end else begin
          q1 <= d;
          q <= q1;
        end
    end
    `endif
 
    //第四种实现方式
   `ifdef DFF_STYLE4
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          q1 = 1'b0;
          q = 1'b0;
        end
        else begin
          q1 = d;
          q = q1;
        end
    end
    `endif
	
	 //第五种实现方式  
    `ifdef DFF_STYLE5 
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          q1 <= 1'b0;
          q <= 1'b0;
        end else begin
          q <= q1;
		  q1 <= d;
        end
    end
    `endif
 
    //第六种实现方式
	
   `ifdef DFF_STYLE6
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          q = 1'b0;
		  q1 = 1'b0; 
        end else begin
          q = q1;
		  q1 = d;
        end
    end
    `endif
	
	//第七种实现方式  
    `ifdef DFF_STYLE5 
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          {q,q1} <= 2'b0;
        end else begin
           {q,q1} <= {q1,d};
        end
    end
    `endif
 
    //第八种实现方式
	
   `ifdef DFF_STYLE6
    always @(posedge clk_i, negedge rst_l_i) begin
        if (!rst_l_i) begin
          {q,q1} = 2'b0; 
        end else begin
          {q,q1} = {q1,d};
        end
    end
    `endif
 
endmodule//dff_exp

dff_tb.v

`timescale 1ns/1ns

module dd_tb;

//..................................................
//reg &wire define
//..................................................
	wire clk_i;
	wire rst_l_i;
	wire d;
	reg q;
	
//..................................................
//clock & reset & d generate
//..................................................

	initial begin
		clk_i <=1'b0;
		forever #5 clk_i <= -clk_i;
	end
	
	initial begin
		rst_l_i <= 1'b1;
		repeat (2) @ (posedge clk_i);
		rst_l_i <= 1'b0;
		repeat (2) @ (posedge clk_i);
		rst_l_i <= 1'b1;
		repeat (20) @ (posedge clk_i);
		$finish(2);
	end
	
	initial begin
		forever begin
			@(posedge clk_i);
			d <= 1'b0;
			@(posedge cllk_i);
			d <= 1'b1;		
		end
	end
	
//..................................................
//Instance of dff_exp
//..................................................
	dff_exp u_dff_exp{
		//Inputs
		.clk_i       ( clk_i   ),
		.rst_l_i     ( rst_l_i ),
		.d           ( d       ),
		//Outputs
		.q           ( q       )
   	};
	
//..................................................
//dump file
//..................................................
	initial begin
		$vcdpluson();
	end
endmodule//dff_tb

Makefile

.PHONY:com sim cov clean

OUTPUT = simv_dff_exp
ALL_DEFINE = +define+DUMP_FSDB
ALL_DEFINE += +define+DFF_STYLE22
#code coverage command
CM = -cm line+cond+fsm+branch+tgl
CM_NAME = -cm_name $(OUTPUT)
CM_DIR = -cm_dir ./$(OUTPUT).vdb

# vpd file name
VPD_NAME = +vpdfiles+$(OUTPUT).vpd

#coompile command
vcs = vcs -sverilog +v2k -timescale=1ns/1ns              \
	-debug_all                                           \
	+nontimingcheck                                      \
	+nospecify                                           \
	+vcs+flush+all                                       \
	$(CM)                                                \
	$(CM_NAME)                                           \
	$(CM_DIR)                                            \
	$(ALL_DEFINE)                                        \
	$(VPD_NAME)                                          \
	-o $(OUTPUT)                                         \
	-l compile.log

#simulation command
SIM = ./$(OUTPUT)                \
			$(CM) $(CM_NAME) $(CM_DIR) \
			$(VPD_NAME)                \
			-l $(OUTPUT).log


# start compile
com:
	$(vcs) -f file_list.f

#start simulation
sim:
	$(SIM)

# show the coverage
cov:
	dve -covdir *.vdb &
debug:
	dve -vpd $(OUTPUT).vpd &


# start clean
clean:
	rm -rf ./csrc *.daidir ./csrc *.log *.vdb *.vdb simv* *.key


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰之行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值