【【简单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
相关推荐
VertexGeek17 分钟前
Rust学习(八):异常处理和宏编程:
学习·算法·rust
二进制_博客1 小时前
Flink学习连载文章4-flink中的各种转换操作
大数据·学习·flink
codebolt1 小时前
ADS学习记录
学习
Komorebi.py2 小时前
【Linux】-学习笔记05
linux·笔记·学习
朝九晚五ฺ10 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
猫爪笔记11 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
pq113_612 小时前
ftdi_sio应用学习笔记 3 - GPIO
笔记·学习·ftdi_sio
澄澈i12 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
爱米的前端小笔记13 小时前
前端八股自学笔记分享—页面布局(二)
前端·笔记·学习·面试·求职招聘
alikami13 小时前
【前端】前端学习
学习