【SpinalHDL】2.数据类型SpinalEnum

人生乱弹 2年前 (2024) admin
9 0

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

文章来源

版权声明:admin 发表于 2024年2月12日 am10:44。
转载请注明:【SpinalHDL】2.数据类型SpinalEnum | 银库

相关文章

本站主题由 OneNav 一为主题强力驱动