verilog分析task的接口设计,证明这种写法:assign {a,b,c,d} = links;
1,task在状态机中的使用好处:

2,RTL设计
module link_ports(
input clk,
input rst_n,
input p,
input q,
output a,
output b,
output c,
output d
);
reg [3:0] links;
reg [1:0] state;
assign {a,b,c,d} = links;
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
state <= 2'b00;
links <= 4'b0000;
end
else
add;
end
task add;
begin
casex(state)
2'b00:
if(p == 0 && q == 0) begin
links <= 4'b0101;
state <= 2'b01;
end
2'b01:
if(p == 0 && q == 1) begin
links <= 4'b0110;
state <= 2'b10;
end
2'b10: begin
links <= 4'b1001;
state <= 2'b11;
end
2'b11:
if(p ==1 && q == 0) begin
links <= 4'b1111;
state <= 2'b00;
end
default: begin
links <= 4'b0000;
state <= 2'b00;
end
endcase
end
endtask
endmodule
3,测试testbench
module tb_link_port;
reg clk;
reg rst_n;
reg p, q;
wire a;
wire b;
wire c;
wire d;
always #10 clk = ~clk;
initial begin
rst_n = 0; clk = 1; p = 0; q = 0;
#10 rst_n = 1;
#20 p = 0; q = 1;
#20 p = 1; q = 0;
#100 $finish;
end
link_ports u1_link_ports(
.clk (clk ),
.rst_n (rst_n ),
.p (p ),
.q (q ),
.a (a ),
.b (b ),
.c (c ),
.d (d )
);
endmodule
4,波形分析,正确!
