• 简单的ALU


    //definitions.sv

     1 package definitions;
     2  
     3  parameter VERSION = "1.2";
     4  
     5  typedef enum bit [2:0] {ADD, SUB,  MULT, DIV, SL, SR} opcodes_t;
     6  
     7  typedef     logic    [31:0]    data_t;
     8     
     9  typedef struct packed {
    10     opcodes_t            opc;
    11     data_t                op_a;
    12     data_t                op_b;
    13  } instr_t;
    14  
    15 endpackage 

    //ALU.sv

     1  import definitions :: *;
     2  
     3  module ALU(
     4  input     logic      clock,
     5  input       instr_t     IW,
     6 output     data_t      alu_out );
     7   
     8  always @(posedge clock) begin
     9     case  (IW.opc)
    10          ADD     :     alu_out = IW.op_a + IW.op_b;
    11          SUB     :     alu_out = IW.op_a -  IW.op_b;
    12          MULT     :     alu_out = IW.op_a *  IW.op_b;
    13          DIV    :     alu_out = IW.op_a /   IW.op_b;
    14          SL      :     alu_out = IW.op_a   <<  1;
    15          SR      :     alu_out = IW.op_a   >>  1;
    16     endcase
    17 end
    18     
    19  endmodule 

    //test.sv

     import definitions :: *;
      
     module test;
     
     timeunit 10ns;
     timeprecision 1ns;
     
     instr_t IW;
     logic [31:0] alu_out;
     logic  clock;
     
     ALU dut (.IW(IW), .alu_out(alu_out), .clock(clock));
     
     initial begin
        clock = 0;
        forever  #10 clock = ~ clock;
    end
     
     initial begin
        @(negedge clock)
            IW = {ADD, 123, 456};
        @(negedge clock)
            IW = {SUB, 762, 456};
        @(negedge clock)
            IW = {DIV, 900, 12};
        @(negedge clock)
            IW = {MULT, 12, 46};
        @(negedge clock)
            IW = {SL, 123, 0};
        @(negedge clock)
            IW = {SR, 123, 0};
         #40
         $stop;
     end
     
     initial begin
        $monitor("%t\t%4d\t%4s\t%4d\t=%4d",  $realtime, IW.op_a, IW.opc, IW.op_b, alu_out);
     end
     endmodule 

    #                    0    x  ADD    x =   x
    #               200000  123  ADD  456 =   x
    #               300000  123  ADD  456 = 579
    #               400000  762  SUB  456 = 579
    #               500000  762  SUB  456 = 306
    #               600000  900  DIV   12 = 306
    #               700000  900  DIV   12 =  75
    #               800000   12 MULT   46 =  75
    #               900000   12 MULT   46 = 552
    #              1000000  123   SL    0 = 552
    #              1100000  123   SL    0 = 246
    #              1200000  123   SR    0 = 246
    #              1300000  123   SR    0 =  61

  • 相关阅读:
    Flutter高仿微信项目开源-具即时通讯IM功能
    flutter 如何实现文件读写(使用篇)
    这是我的第一篇博客,测试文章
    对于ServiceManager的理解
    Class文件结构
    App进程的启动
    对于SystemServer的理解
    对于Zygote的理解
    Git内部原理浅析
    二叉搜索树(BST)基本操作
  • 原文地址:https://www.cnblogs.com/Neddy/p/2732649.html
Copyright © 2020-2023  润新知