• cpu设计和实现(iverilog工具)


    【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

            编写verilog的工具不少。大家熟知的modelsim、quartus和vivado都可以用来编写的。前者主要是用来仿真,quartus主要用于altera芯片(现在属于intel),vivado则服务于xilinx芯片(现在属于amd)。如果不愿意破解,其实找到一款合适的工具还是蛮难的,而且简单、方便、好上手。好在开源工具有iverilog这样一款工具,windows、linux、mac都可以安装。暂时不想购买开发板的朋友,可以试试,至少入门是不成问题的。

            代码链接地址,https://github.com/feixiaoxing/design_mips_cpu/tree/master/rtl/day01

    1、安装地址

    http://bleyer.org/icarus/iverilog-v11-20190809-x64_setup.exe

            工具中本身包含了iverilog和gtkwave,前者负责编译,后者负责显示。

    2、编译命令

    1. C:\iverilog\bin\iverilog.exe -o tb tb.v cnt.v
    2. C:\iverilog\bin\vvp.exe -n tb -lxt2
    3. C:\iverilog\gtkwave\bin\gtkwave.exe hello.vcd

            命令主要是分成了三个部分。第一个命令iverilog主要是把所有的verilog文件编译在一起。第二个命令主要是仿真执行。第三个命令主要是把生成的hello.vcd文件显示出来。

    3、cnt.v

            这是一个计数的代码,主要是周期性输出一个trigger信号。

    1. module count(rst, clk, out);
    2. // input & output
    3. input rst;
    4. input clk;
    5. output out;
    6. // wire & reg
    7. wire rst;
    8. wire clk;
    9. reg ce;
    10. reg out;
    11. // inner wire & reg
    12. reg[5:0] cnt;
    13. // clause defined
    14. always @(posedge clk or posedge rst)
    15. if(rst)
    16. ce <= 1'b0;
    17. else
    18. ce <= 1'b1;
    19. always @(posedge clk or posedge rst)
    20. if (rst) begin
    21. cnt <= 6'h00;
    22. end else if (ce == 1'b1)begin
    23. if (cnt == 6'd59)
    24. cnt <= 6'h00;
    25. else
    26. cnt <= cnt + 1;
    27. end
    28. always @(posedge clk or posedge rst)
    29. if(rst)
    30. out <= 1'b0;
    31. else if(out == 1'b1)
    32. out <= 1'b0;
    33. else if(cnt == 6'd59)
    34. out <= 1'b1;
    35. endmodule

               整个代码是关于定时输出trigger信号的代码。首先,有一个ce信号,它在rst后的第一个时钟上升沿才变得有效。接着有了ce信号之后,cnt信号就可以开始自增了。自增的范围是0~59。等到cnt等于59的时候,就恢复为0。out就是触发信号,除了一开始复位为0的时候,其他时刻只有cnt==59的时候才会翻转为1,并且只翻转一次,马上又恢复为0。

    4、tb.v测试代码

    1. `timescale 1ns/1ps
    2. module test();
    3. reg rst;
    4. reg clk;
    5. wire data;
    6. count tt(.rst(rst),
    7. .clk(clk),
    8. .out(data));
    9. initial
    10. begin
    11. rst = 0;
    12. clk = 0;
    13. #12 rst = 1;
    14. #21 rst = 0;
    15. #1000 $finish;
    16. end
    17. initial
    18. begin
    19. while(1)
    20. clk = #5 !clk;
    21. end
    22. initial
    23. begin
    24. $dumpfile("hello.vcd");
    25. $dumpvars(0, test);
    26. end
    27. endmodule

            tb.v其实就相当于单元测试。给被测试函数输入指定的信号,观察信号是否按照我们之前设定的设计运行。如果是,则皆大欢喜。否则,就要回过头来看一下,确认错误发生的位置,并及时修正。注意中间的hello.vcd文件,这就是生成的中间结果,最终的波形都要通过它显示出来。

            另外,注意tb.v里面的信号类型和 cnt.v里面一般是反着来的。

    5、波形显示

            hello.vcd文件直接用gtkwave显示就好,中间的波形可以自己选择,

            这个工具虽然粗糙了一些,但是基本的功能都是在的。 左上是模块,左下是模块对应的信号。中间是需要查看的信号。右侧是观察到的数据,大家如果使用过逻辑分析仪,应该观察过对应的场景。信号的放大、缩小、拖拽、信号的显示格式,这些功能都是在的。用它来仿真,其实问题不大。

  • 相关阅读:
    [附源码]计算机毕业设计JAVA班级班费缴纳及使用情况管理
    MySQL
    WPF性能优化:形状(Shape)、几何图形(Geometry)和图画(Drawing)的使用
    二氧化钛纳米粒TIO2修饰多肽R8/CTT2/CCK8/GE11/cTAT/CPP/RVG29/SP94(无机纳米粒子偶联多肽)
    Apache DolphinScheduler PMC:开源不一定也要九死一生
    leetcode10--正则表达式
    mmlab实现图像分类
    C++ 语言学习 day10 复习(1)
    Kubernetes IPVS和IPTABLES
    MySQL InnoDB Cluster部署
  • 原文地址:https://blog.csdn.net/feixiaoxing/article/details/127877344