zoukankan      html  css  js  c++  java
  • Linux中使用Makefile来运行QuestaSim

    环境:Win7x64,VMware15.0,centOS7.0,QuestaSim10.7c

    假设已经编辑好了一个全加器还有运行这个DUT的testbech,代码如下:

    点击查看代码

    // filename: full_adder.v
    
    module full_adder(
      input wire a_in,
      input wire b_in,
      input wire c_in,
      output wire sum_out,
      output wire c_out
    );
    
    assign sum_out = a_in & b_in & c_in;
    assign c_out = (a_in & b_in) | (b_in & c_in) | (a_in & c_in);
    
    endmodule

    点击查看代码

    // filename: full_adder_tb.v
    
    module full_adder_tb; 
      reg ain, bin, cin;
      wire sumout, cout;
      
      //task 1: createan instance
      full_adder u_full_adder(
        .a_in (ain),
        .b_in (bin),
        .c_in (cin),
        .sum_out (sumout),
        .c_out (cout)
      );
    
      //task 2: clock and reset generator 
      parameter CLK_PERIOD = 20;
      reg clk, reset_n;
    
      initial begin
        clk = 0;
        forever begin
          #(CLK_PERIOD/2) clk = ~clk;
        end
      end
      
      initial begin
        reset_n = 0;
        #100 reset_n = 1;
      end
    
      //task 3: drive the stimulus and capture the response
      initial begin
        #110 ain = 0; bin = 0; cin =0; //00
        #20 ain = 0; bin = 1; cin =0; //01
        #20 ain = 1; bin = 0; cin =0; //01
        #20 ain = 1; bin = 1; cin =0; //10
        #20 ain = 0; bin = 0; cin =1; //01
        #20 ain = 0; bin = 1; cin =1; //10
        #20 ain = 1; bin = 0; cin =1; //10
        #20 ain = 1; bin = 1; cin =1; //11
        #50 $finish;
      end
    
      //task 4: check the result
      always @ (posedge clk) begin
        if(!reset_n)begin
          $display("%t:%m:resetting...",$time);
        end
        else begin
          $display("%t:%m:resetting finish!",$time);
        end 
      end
    
      initial begin
        #115 if({cout,sumout}!=2'b00)
          $display("%t, Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", $time, {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b01)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b01)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b10)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b01)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b10)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b10)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
        #20 if({cout,sumout} != 2'b11)
          $display("Error: {cout,sumout} = %b, ain = %b, bin = %b, cin = %b", {cout,sumout}, ain, bin, cin);
      end
      
      //task 5: dump wave form with the compile option -debug_all
      initial begin
        $vcdpluson;
      end
    
    endmodule

    方法一、运行QuestaSim界面来进行仿真

    打开终端

    输入:which vsim //查找QuestaSim位置并确认其可用性

    输入:vsim 打开软件

    balabala:

    New Project: Name: full_adder, Default Library Name: work

    -> Add existing file: full_adder.v, full_adder_tb.v

    -> Compile All

    -> Start simulation: work.full_adder_tb.v

    -> Object: Add Wave -> Run or Run all

    方法二:新建makefile,代码如下,终端输入make即可:

    all: create_lib compile simulate 
    
    create_lib:
    	vlib work
    
    compile:
    	vlog -l comp.log -sv full_adder.v full_adder_tb.v
    
    simulate:
    	vsim -l sim.log -voptargs=+acc work.full_adder_tb -do "log -r *; run -all"
    	
    clean:
    	rm -rf *work mti_lib transcript modelsim.ini *wlf seq.cr.mti seq.mpf *.log

     就可以啦。


    两个小问题:

    1、QuestaSim中代码模块字体显示过小的问题

    2、novopt: Optimizations are Disabled的问题

    3、$vcdpluson is not defined的问题 

    4、makefile的代替版本【For VCS】:

    点击查看代码

    run: compile simulate
    compile
    	vcs -debug_all timescale.v full_adder.v full_adder_tb.v -l com.log
    
    simulate:
    	./simv -l sim.log
        
    run_cov: compile_coverage simulate_coverage
    
    compile_coverage:
    	vcs -debug_all -cm line+cond+fsm+tgl+branch -lca timescale.v full_adder.v full_adder_tb.v -l com.log
        
    simulate_coverage:
    	./simv -cm line+cond+fsm+tgl+branch -lca -cm_log cm.log -l sim.log
        
    clean:
    	rm -rf *.log

    Good Luck !

  • 相关阅读:
    js 字符串indexOf方法封装
    js 冒泡排序
    CSS定位 position的三个属性 elative 、absolute、fixed :
    让父元素能感知浮动的子元素 #用伪元素清除浮动
    三个路由器的连接,中间路由的配置(静态路由)
    IDEA 添加tomcat出错: Error: Environment variable name is not set 我的解决方法
    通过基于AspectJ 注解的方式实现Spring AOP报 can't find referenced pointcut myPointCut 错误,我的解决方法
    C语言fopen函数打开文本文件与二进制文件的区别
    位运算的奇技淫巧 系列1
    位运算例子(以后会逐渐补充)
  • 原文地址:https://www.cnblogs.com/shadrach/p/15542110.html
Copyright © 2011-2022 走看看