【【简单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
相关推荐
speop34 分钟前
【datawhale组队学习】TASK01|课程导论:站在认知范式的临界点
人工智能·学习
s09071361 小时前
FPGA中CIC设计注意事项
算法·fpga开发·cic滤波器
roman_日积跬步-终至千里1 小时前
【人工智能原理(1)】要点总结:从搜索、学习到推理的智能之路
人工智能·学习
Aaron15881 小时前
RFSOC+VU13P在无线信道模拟中的技术应用分析
数据结构·人工智能·算法·fpga开发·硬件架构·硬件工程·射频工程
我不会写代码njdjnssj1 小时前
SSM框架学习
学习
阿蒙Amon1 小时前
JavaScript学习笔记:14.类型数组
javascript·笔记·学习
碎碎思2 小时前
BerkeleyLab Bedrock:为 FPGA 与加速计算打造的开源基石
fpga开发·开源
zidan14122 小时前
xilinx常用文档说明
fpga开发
ShiMetaPi2 小时前
GM-3568JHF丨ARM+FPGA异构开发板系列教程:外设教程 04 WIFI
网络·arm开发·fpga开发·智能路由器·fpga
代码游侠2 小时前
学习笔记——写时复制(Copy-on-Write)
linux·网络·笔记·学习·写时复制