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