【SpinalHDL】2.数据类型SpinalEnum

本文介绍了如何在SpinalHDL中使用SpinalEnum类创建枚举类型,以及如何通过SpinalConfig进行Verilog代码生成,包括自定义编码方式和控制生成的预设选项。
摘要由CSDN通过智能技术生成

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
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值