iverilog使用之乘法模块仿真

iverilog是一个非常好的开源仿真器,可以直接在命令行中操作,结合vscode使用起来非常方便。但必须要强调的是,iverilog仿真器局限性很大,对systemverilog等新特性支持性不佳,仅能满足最基本的一些仿真编译需求,不过在一些小项目中还是比较有优势的,不需要再在modelsim中新建一个工程,省去了不少麻烦。
下载安装iverilog这里就不说了,不算很难,官网下载然后添加path就好了。
这里举例一个乘法模块的编写与仿真。

功能概述

FPGA中实现乘法并不容易,有时直接用*需要调用开发板自身的运算IP,这里自己写一个纯算法乘法,并进行tb仿真。

乘法模块

module multiplication(
    input     [3:0] a,
    input     [3:0] b,
    output    [7:0] product
);
    integer i;
    reg [7:0] multiplication;

    always @(a or b) begin
      multiplication = 0;
      for (i = 0; i < 4; i = i + 1) begin
        if (b[i]) begin
          multiplication = multiplication + (a << i);
        end
      end
    end

    assign  product = multiplication;

endmodule

tb模块

`timescale 1ns/1ps
module multiplication_tb;
    reg [3:0] a;
    reg [3:0] b;
    wire [7:0] product;

    multiplication uut(
        .a(a),
        .b(b),
        .product(product)
    );

    initial begin

        $dumpfile("multiplier_tb.vcd");
        $dumpvars(0, multiplication_tb);


        a = 4'b0000;
        b = 4'b0000;

       // 应用测试向量
        #10 a = 4'b0011; b = 4'b0010; // 3 * 2 = 6
        #10 a = 4'b0101; b = 4'b0011; // 5 * 3 = 15
        #10 a = 4'b1111; b = 4'b1111; // 15 * 15 = 225
        #10 a = 4'b0110; b = 4'b0100; // 6 * 4 = 24
        #10 a = 4'b1001; b = 4'b0010; // 9 * 2 = 18

        #10 $finish;
    end

endmodule

注意,这里面的

$dumpfile("multiplier_tb.vcd");
$dumpvars(0, multiplication_tb);

必须要加,和Linux下使用vcs仿真一样,这两句是为了产生波形文件,后缀采用.vcd,(Linux下vcs一般采用.fsdb后缀文件,注意区别)

iverilog编译与仿真

程序建立好后,直接在vscode中打开终端,按照

iverilog -o 你想要生成的仿真名称 仿真文件.v

的格式输入,例如,我这里是
在这里插入图片描述
之后会生成一个simn文件,
接着,执行这个文件:

vvp 你想要生成的仿真名称

例如,我这里是
在这里插入图片描述
如果程序正确没有报错,此时会产生一个.vcd文件,文件名就是你在$dumpfile("multiplier_tb.vcd");中命名的。
之后想要看波形,直接按照:

gtkwave vcd文件名称.vcd

例如我这里是
在这里插入图片描述
此时,桌面会弹出gtkwave波形查看程序,刚开始打开应该像下面的样子:
在这里插入图片描述
界面里什么都没有,不要急,像modelsim一样把信号添加进去就可以了。
在这里插入图片描述
信号添加进来之后,这里并不像modelsim一样还需要点一次执行,这里加进来之后信号就已经跑出来了,可以点击下面的zoom fit适应窗口,就可以看到完整的波形了。也可以右键信号名称选择想要的数字展示格式。
在这里插入图片描述

完毕,一个完整的基于iverilog仿真编译的小程序成功测试。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,矩阵乘法可以使用*运算符进行操作。根据引用\[1\]中的代码示例,自定义函数中的矩阵乘法应该是正常的。然而,你的朋友遇到了一个问题,即输入一个31的矩阵与一个43的矩阵相乘后,得到的结果仍然是一个4x3的矩阵。这可能是由于你的朋友在自定义函数中的代码逻辑有误导致的。 另外,根据引用\[2\]和引用\[3\]中的示例,还有其他一些矩阵运算符可以在Matlab中使用。例如,使用./运算符可以进行矩阵的逐元素除法,使用.*运算符可以进行矩阵的逐元素乘法。 如果你的朋友遇到了问题,可能需要检查自定义函数中的代码逻辑是否正确,并确保输入矩阵和乘法运算符的维度匹配。此外,还可以尝试使用其他矩阵运算符来解决问题,如引用\[2\]和引用\[3\]中所示的逐元素除法和逐元素乘法。 #### 引用[.reference_title] - *1* [[Matlab] Simulink 自定义函数中的矩阵乘法工作不正常时可以使用模块库中的矩阵乘法模块代替](https://blog.csdn.net/PriceCheap/article/details/125649066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [matlab中的乘除法](https://blog.csdn.net/u013925378/article/details/53695147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值