【【简单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
相关推荐
MartinYeung55 分钟前
[论文学习]Skill-MAS:面向自动多智能体系统的元技能进化
大数据·人工智能·学习
阳光九叶草LXGZXJ8 分钟前
达梦数据库-报错-11-cmd 13 validate error
linux·运维·数据库·sql·学习
~光~~14 分钟前
【嵌入式linux学习_OV8858 bring up】L1_从Sensor到RK3588发生了什么
linux·运维·学习
m4Rk_38 分钟前
【论文阅读】Agent 记忆机制(27):MemRefine——用 LLM 事实判断将长期记忆压缩到固定预算
论文阅读·人工智能·学习
星恒随风1 小时前
Linux 权限详解:从 rwx、chmod 到 umask、目录权限与粘滞位
linux·运维·服务器·笔记·学习
阳光九叶草LXGZXJ1 小时前
达梦数据库-报错-12-[-7184]:对象定义[XXX]被修改,版本检查失败
linux·运维·服务器·数据库·sql·学习
知识分享小能手4 小时前
高等数学学习教程,从入门到精通,定积分 — 知识点全面总结(10)
学习·机器学习·概率论
暗影凋落11 小时前
CMake构建学习笔记-SQLite库的构建
笔记·学习·sqlite
画面无声12 小时前
STM32的SPI通信原理与练习记录
c语言·stm32·单片机·嵌入式硬件·学习
你有哈莫吗13 小时前
CMake构建学习笔记-iconv库的构建
笔记·学习