enum 可以在 systemverilog 中输出吗?
Can enum be made an output in systemverilog?
在 verilog 中,我可以这样做:
module controller (
input rstb, clk, start,
output reg [1:0] state, next_state
);
parameter S_idle = 2'b00, S_1 = 2'b01, S_2 = 2'b11;
always @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule
但在 systemverilog 中,这会产生错误,因为我声明了两次 state, next_state
:
module controller (
input rstb, clk, start,
output logic [1:0] state, next_state
);
enum logic [1:0] {S_idle, S_1, S_2} state, next_state;
always_ff @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule
我想我可以将我的输出端口重命名为 state_out, next_state_out
并将它们分配给 state, next_state
。有没有更简单的方法来使用枚举作为输出?
当使用用户定义的类型时,您应该使用 typedef
并将它们放在一个包中,以便它们可以在使用它们的模块之间共享。否则你 运行 进入类型不兼容分配错误。
package stuff;
typedef enum logic [1:0] {S_idle, S_1, S_2} state_t;
endpackage
module controller import stuff::*; (
input logic rstb, clk, start,
output state_t state, next_state
);
always_ff @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule
在 verilog 中,我可以这样做:
module controller (
input rstb, clk, start,
output reg [1:0] state, next_state
);
parameter S_idle = 2'b00, S_1 = 2'b01, S_2 = 2'b11;
always @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule
但在 systemverilog 中,这会产生错误,因为我声明了两次 state, next_state
:
module controller (
input rstb, clk, start,
output logic [1:0] state, next_state
);
enum logic [1:0] {S_idle, S_1, S_2} state, next_state;
always_ff @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule
我想我可以将我的输出端口重命名为 state_out, next_state_out
并将它们分配给 state, next_state
。有没有更简单的方法来使用枚举作为输出?
当使用用户定义的类型时,您应该使用 typedef
并将它们放在一个包中,以便它们可以在使用它们的模块之间共享。否则你 运行 进入类型不兼容分配错误。
package stuff;
typedef enum logic [1:0] {S_idle, S_1, S_2} state_t;
endpackage
module controller import stuff::*; (
input logic rstb, clk, start,
output state_t state, next_state
);
always_ff @ (posedge clk, negedge rstb)
begin
if (!rstb) state <= S_idle;
else state <= next_state;
end
...
endmodule