本文主要是介绍【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
这篇关于【SpinalHDL】2.数据类型SpinalEnum的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!