【SpinalHDL】2.数据类型SpinalEnum

2.1枚举类型(SpinalEnum <-> localparam/define)

使用起来比较简单,只需要定义一个对象即可。

import spinal.core._  
  
object Enum extends SpinalEnum(defaultEncoding = binarySequential) {  
  val encoding = SpinalEnumEncoding("dynamicEncoding", _ * 2 + 1)  
  defaultEncoding = encoding  
  
  val a, b, c = newElement  
}  
class DemoEnum extends Component {  
  val enum = Reg(Enum) init Enum.a  
}  
  
object DemoEnum extends App {  
//  SpinalVerilog(new DemoEnum)  
  SpinalConfig(enumPrefixEnable = false,enumGlobalEnable = true).withoutEnumString().generateVerilog(new DemoEnum)  
}

其中object Enum对象实现的基本的SpinalEnum类的定义,注意其中的编码方式,为自定义的编码方式。
类Demo Enum初始化一个寄存器enum,并将其初始化为a。

`timescale 1ns/1ps  
`define a 3'b001  
`define b 3'b011  
`define c 3'b101  
  
  
module DemoEnum (  
  input               clk,  
  input               reset  
);  
  
  wire       [2:0]    enum_2;  
  
  assign enum_2 = `a;  
  
endmodule

最后转化后的结果是如上图所示。
重点生成Verilog时,SpinalConfig的使用,其中enumPrefixEnable = false不生成变量前的前缀,enumGlobalEnable = true将enum默认生成的是define宏,withoutEnumString()则不生成仿真时的string描述,对比下就知道了,下面默认的生成结果。

  
`timescale 1ns/1ps  
  
module DemoEnum (  
  input               clk,  
  input               reset  
);  
  localparam Enum_1_a = 3'd1;  
  localparam Enum_1_b = 3'd3;  
  localparam Enum_1_c = 3'd5;  
  
  wire       [2:0]    enum_2;  
  `ifndef SYNTHESIS  
  reg [7:0] enum_2_string;  
  `endif  
  
  
  `ifndef SYNTHESIS  
  always @(*) begin  
    case(enum_2)  
      Enum_1_a : enum_2_string = "a";  
      Enum_1_b : enum_2_string = "b";  
      Enum_1_c : enum_2_string = "c";  
      default : enum_2_string = "?";  
    endcase  end  `endif  
  
  assign enum_2 = Enum_1_a;  
  
endmodule

你可能感兴趣的:(fpga开发,verilog,scala)