parametrized the config interfaces to better usability
authorNeel <neelgala@gmail.com>
Mon, 16 Jul 2018 09:22:49 +0000 (14:52 +0530)
committerNeel <neelgala@gmail.com>
Mon, 16 Jul 2018 09:22:49 +0000 (14:52 +0530)
src/bsv/bsv_lib/gpio.bsv
src/bsv/bsv_lib/gpio_instance.bsv

index 5e0dc9a3fb2cbff49b845cea3f06f62c3219244a..ad0650f6983cc505179325138443561beca8ffb6 100644 (file)
@@ -24,20 +24,34 @@ package gpio;
        /*============================ */
        `include "instance_defines.bsv"
 
-       interface GPIO#(numeric type ionum);
+       interface GPIO_config#(numeric type ionum);
                (*always_ready,always_enabled*)
                method Action gpio_in (Vector#(ionum,Bit#(1)) inp);
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_out;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_out_en;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_DRV0;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_DRV1;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_DRV2;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PD;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PPEN;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PRG_SLEW;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PUQ;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PWRUPZHL;
+               (*always_ready*)
                method Vector#(ionum,Bit#(1))   gpio_PWRUP_PULL_EN;
+  endinterface
+  interface GPIO#(numeric type ionum);
+    interface GPIO_config#(ionum) pad_config;
                interface AXI4_Lite_Slave_IFC#(`ADDR,`DATA,`USERSPACE) axi_slave;
        endinterface
 
@@ -167,76 +181,78 @@ package gpio;
                endrule
 
                interface axi_slave= s_xactor.axi_side;
-               method Action gpio_in (Vector#(ionum,Bit#(1)) inp);
-                       for(Integer i=0;i<ionum;i=i+1)
-                               datain_register[i]<=inp[i];
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_out;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=dataout_register[i];
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_out_en;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(direction_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_DRV0;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(drv0_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_DRV1;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(drv1_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_DRV2;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(drv2_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PD;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(pd_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PPEN;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(ppen_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PRG_SLEW;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(prg_slew_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PUQ;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(puq_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PWRUPZHL;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(pwrupzhl_reg[i]);
-                       return temp;
-               endmethod
-               method Vector#(ionum,Bit#(1))   gpio_PWRUP_PULL_EN;
-                       Vector#(ionum,Bit#(1)) temp;
-                       for(Integer i=0;i<ionum;i=i+1)
-                               temp[i]=pack(pwrup_pull_en_reg[i]);
-                       return temp;
-               endmethod
+    interface pad_config=interface GPIO_config
+       method Action gpio_in (Vector#(ionum,Bit#(1)) inp);
+                       for(Integer i=0;i<ionum;i=i+1)
+                               datain_register[i]<=inp[i];
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_out;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=dataout_register[i];
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_out_en;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(direction_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_DRV0;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(drv0_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_DRV1;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(drv1_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_DRV2;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(drv2_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PD;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(pd_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PPEN;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(ppen_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PRG_SLEW;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(prg_slew_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PUQ;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(puq_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PWRUPZHL;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(pwrupzhl_reg[i]);
+                       return temp;
+               endmethod
+               method Vector#(ionum,Bit#(1))   gpio_PWRUP_PULL_EN;
+                       Vector#(ionum,Bit#(1)) temp;
+                       for(Integer i=0;i<ionum;i=i+1)
+                               temp[i]=pack(pwrup_pull_en_reg[i]);
+                       return temp;
+               endmethod
+    endinterface;
        endmodule
 
 endpackage
index 2a0893d02354f51e725a52fec4dc63cc2113f3d0..a6dc260650a5ce8b6ad30e301736c3f62ab68f77 100644 (file)
@@ -27,38 +27,19 @@ package gpio_instance;
 
   // instantiation template
        interface GPIO_real;
-               method Action gpio_in (Vector#(32,Bit#(1)) inp);
-               method Vector#(32,Bit#(1))   gpio_out;
-               method Vector#(32,Bit#(1))   gpio_out_en;
-               method Vector#(32,Bit#(1))   gpio_DRV0;
-               method Vector#(32,Bit#(1))   gpio_DRV1;
-               method Vector#(32,Bit#(1))   gpio_DRV2;
-               method Vector#(32,Bit#(1))   gpio_PD;
-               method Vector#(32,Bit#(1))   gpio_PPEN;
-               method Vector#(32,Bit#(1))   gpio_PRG_SLEW;
-               method Vector#(32,Bit#(1))   gpio_PUQ;
-               method Vector#(32,Bit#(1))   gpio_PWRUPZHL;
-               method Vector#(32,Bit#(1))   gpio_PWRUP_PULL_EN;
-               interface AXI4_Lite_Slave_IFC#(`ADDR,`DATA,`USERSPACE) axi_slave;
+    interface GPIO_config#(32) bankA_config;
+               interface AXI4_Lite_Slave_IFC#(`ADDR,`DATA,`USERSPACE) bankA_slave;
+    interface GPIO_config#(15) bankB_config;
+               interface AXI4_Lite_Slave_IFC#(`ADDR,`DATA,`USERSPACE) bankB_slave;
        endinterface
   (*synthesize*)
   module mkgpio_real(GPIO_real);
-    GPIO#(32) mygpioA <-mkgpio();
-    method  gpio_out              =mygpioA.gpio_out ;
-    method  gpio_out_en           =mygpioA.gpio_out_en;
-    method  gpio_DRV0             =mygpioA.gpio_DRV0;
-    method  gpio_DRV1             =mygpioA.gpio_DRV1;
-    method  gpio_DRV2             =mygpioA.gpio_DRV2;
-    method  gpio_PD               =mygpioA.gpio_PD;
-    method  gpio_PPEN             =mygpioA.gpio_PPEN;
-    method  gpio_PRG_SLEW         =mygpioA.gpio_PRG_SLEW;
-    method  gpio_PUQ              =mygpioA.gpio_PUQ;
-    method  gpio_PWRUPZHL         =mygpioA.gpio_PWRUPZHL;
-    method  gpio_PWRUP_PULL_EN    =mygpioA.gpio_PWRUP_PULL_EN;
-               method Action gpio_in (Vector#(32,Bit#(1)) inp);
-      mygpioA.gpio_in(inp);
-    endmethod
-    interface axi_slave=mygpioA.axi_slave;
+    GPIO#(32) mygpioA <- mkgpio();
+    GPIO#(15) mygpioB <- mkgpio();
+    interface bankA_config=mygpioA.pad_config;
+    interface bankB_config=mygpioB.pad_config;
+    interface bankA_slave=mygpioA.axi_slave;
+    interface bankB_slave=mygpioB.axi_slave;
   endmodule
 endpackage