【【简单systyem verilog 语言学习使用二--- 新adder加法器 】】

【【简单systyem verilog 语言学习使用二--- 新adder加法器 】】

adder.v

c 复制代码
module  addernew(
    input                          clk    ,
    input                          rst_n  ,
    input             [2 : 0]      in_a   ,
    input             [2 : 0]      in_b   ,
    input                          sel    ,   // 选择器
    output     reg    [4 : 0]      sum    ,
    output     reg    [4 : 0]      carry
  );


  always@(posedge  clk  or  negedge rst_n )
  begin
    if(rst_n == 0)
    begin
      carry <=  0  ;
      sum   <=  0  ; 
    end
    else
    begin
      if( sel == 0)
      begin
        {carry,sum }  <=  in_a  + in_b  ;
      end
      else
      begin
        {carry,sum }  <=  in_a * in_b  ;
      end
    end
  end

endmodule

adder_tb.sv

c 复制代码
class input_0;
  static int count = 0;
  int id;
  logic [2:0] ina; // 与 in_a 和 in_b 一致的类型
  int arr[5] = '{1, 2, 3, 4, 5};

  // constructor
  function new();
    this.id = count++;
  endfunction

  // task to show values
  task showk();
    foreach (arr[i]) begin
      automatic int k = arr[i];
      $write("%d\n", k);
    end
  endtask

  // function to run with input
  function void run(int a);
    ina = a; // 直接赋值
    $display("ina number is %3d", ina);
  endfunction
endclass

module test();
  input_0 inst_a, inst_b;
  logic clk;
  logic rst_n;
  logic sel;
  logic [2:0] in_a, in_b; // 使用 logic 代替 wire
  logic [4:0] sum, carry;

  // Generate clock
  initial begin
    clk = 0;
    forever #5 clk = ~clk;
  end

  // Adder module instantiation
  addernew uadder (
      .clk(clk),
      .rst_n(rst_n),
      .in_a(in_a), // 从 in_a 获取值
      .in_b(in_b), // 从 in_b 获取值
      .sel(sel),
      .sum(sum),
      .carry(carry)
  );

  initial begin
    rst_n = 0; // 初始化复位信号
    inst_a = new();
    inst_b = new();
    $display("inst_a id = %d", inst_a.id);
    $display("inst_b id = %d", inst_b.id);

    inst_a.showk();
    inst_b.showk();

    #10 rst_n = 1; // 释放复位信号

    sel = 1; // 选择信号
    inst_a.run(3); // 运行 inst_a
    inst_b.run(2); // 运行 inst_b

    // 赋值 in_a 和 in_b
    in_a = inst_a.ina; 
    in_b = inst_b.ina; 

    #105; // 等待一段时间

    // 打印结果
    $display("ina = %3d, inb = %3d, sel = %d, sum = %5d, carry = %5d",
             in_a, in_b, sel, sum, carry);
             $display("time = %t",$time);
  end
endmodule
相关推荐
VertexGeek11 分钟前
Rust学习(三):rust基础Ⅱ
开发语言·学习·rust
南宫理的日知录1 小时前
106、Python并发编程:深入浅出理解线程池的内部实现原理
开发语言·python·学习·编程学习
懒惰的bit7 小时前
基础网络安全知识
学习·web安全·1024程序员节
Natural_yz10 小时前
大数据学习09之Hive基础
大数据·hive·学习
龙中舞王10 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity
Natural_yz10 小时前
大数据学习10之Hive高级
大数据·hive·学习
love_and_hope10 小时前
Pytorch学习--神经网络--完整的模型训练套路
人工智能·pytorch·python·深度学习·神经网络·学习
夜雨星辰48711 小时前
Android Studio 学习——整体框架和概念
android·学习·android studio
奔跑的花短裤11 小时前
少儿编程启蒙学习
学习·青少年编程·机器人·ai编程
VertexGeek11 小时前
Rust学习(一):初识Rust和Rust环境配置
开发语言·学习·rust