(原创)system verilog——uart发送模块的设计

仿真结果如下:

(原创)system verilog——uart发送模块的设计

p_start是验证从载入要发送的数据到发送低有效的起始位这段时间的时序是否正确,,p_shift是验证从准备好开始发送到发送过程中

的数据的九次移位是否正确,p_state是跟踪发送过程中状态机的状态。

具体代码如下:

 

(原创)system verilog——uart发送模块的设计(原创)system verilog——uart发送模块的设计Code
  1(原创)system verilog——uart发送模块的设计`timescale 1ns/10ps
  2(原创)system verilog——uart发送模块的设计module uart_tx(din,load,clk,rst,txd,ready,c_state);
  3(原创)system verilog——uart发送模块的设计parameter fifo_sva=1'b1;
  4(原创)system verilog——uart发送模块的设计input [7:0] din;       
  5(原创)system verilog——uart发送模块的设计input load;        
  6(原创)system verilog——uart发送模块的设计input clk;            
  7(原创)system verilog——uart发送模块的设计input rst;             
  8(原创)system verilog——uart发送模块的设计output txd;        
  9(原创)system verilog——uart发送模块的设计output ready;            
 10(原创)system verilog——uart发送模块的设计output [3:0]c_state;        //state output,just for debug
 11(原创)system verilog——uart发送模块的设计
 12(原创)system verilog——uart发送模块的设计logic ready;            //ready status bit
 13(原创)system verilog——uart发送模块的设计logic shift;   //shift bit
 14(原创)system verilog——uart发送模块的设计logic txd;                //transmit bit
 15(原创)system verilog——uart发送模块的设计
 16(原创)system verilog——uart发送模块的设计logic [7:0] hold;            //holding the data
 17(原创)system verilog——uart发送模块的设计logic [8:0] send;   //send bits
 18(原创)system verilog——uart发送模块的设计    
 19(原创)system verilog——uart发送模块的设计//load data
 20(原创)system verilog——uart发送模块的设计[email protected](posedge clk or posedge rst)
 21(原创)system verilog——uart发送模块的设计begin
 22(原创)system verilog——uart发送模块的设计    if(rst)
 23(原创)system verilog——uart发送模块的设计     hold<=0;
 24(原创)system verilog——uart发送模块的设计    else if(load)
 25(原创)system verilog——uart发送模块的设计     hold<=din;
 26(原创)system verilog——uart发送模块的设计    else 
 27(原创)system verilog——uart发送模块的设计     hold<=hold;
 28(原创)system verilog——uart发送模块的设计end 
 29(原创)system verilog——uart发送模块的设计//ready to send bit
 30(原创)system verilog——uart发送模块的设计[email protected](posedge clk or posedge rst)
 31(原创)system verilog——uart发送模块的设计begin
 32(原创)system verilog——uart发送模块的设计    if(rst)
 33(原创)system verilog——uart发送模块的设计     ready<=0;
 34(原创)system verilog——uart发送模块的设计    else if(load)
 35(原创)system verilog——uart发送模块的设计     ready<=1;
 36(原创)system verilog——uart发送模块的设计    else 
 37(原创)system verilog——uart发送模块的设计     ready<=0;
 38(原创)system verilog——uart发送模块的设计end
 39(原创)system verilog——uart发送模块的设计
 40(原创)system verilog——uart发送模块的设计//shift and send bit
 41(原创)system verilog——uart发送模块的设计[email protected](posedge clk or posedge rst)
 42(原创)system verilog——uart发送模块的设计begin
 43(原创)system verilog——uart发送模块的设计    if(rst)begin
 44(原创)system verilog——uart发送模块的设计     send[8:0]<=9'b111111111;
 45(原创)system verilog——uart发送模块的设计     txd<=1'b1;
 46(原创)system verilog——uart发送模块的设计    end
 47(原创)system verilog——uart发送模块的设计    else if(ready)begin
 48(原创)system verilog——uart发送模块的设计(原创)system verilog——uart发送模块的设计     send[8:0]<=(原创)system verilog——uart发送模块的设计{hold,1'b0};
 49(原创)system verilog——uart发送模块的设计     txd<=send[0];
 50(原创)system verilog——uart发送模块的设计    end
 51(原创)system verilog——uart发送模块的设计    else if(shift)begin
 52(原创)system verilog——uart发送模块的设计(原创)system verilog——uart发送模块的设计     send[8:0]<=(原创)system verilog——uart发送模块的设计{1'b1,send[8:1]};
 53(原创)system verilog——uart发送模块的设计     txd<=send[0];
 54(原创)system verilog——uart发送模块的设计    end
 55(原创)system verilog——uart发送模块的设计    else begin
 56(原创)system verilog——uart发送模块的设计     send<=send;
 57(原创)system verilog——uart发送模块的设计     txd<=send[0];
 58(原创)system verilog——uart发送模块的设计    end
 59(原创)system verilog——uart发送模块的设计end
 60(原创)system verilog——uart发送模块的设计
 61(原创)system verilog——uart发送模块的设计// state machine    
 62(原创)system verilog——uart发送模块的设计parameter [3:0//synopsys enum STATE_TYPE
 63(原创)system verilog——uart发送模块的设计    UART_IDLE = 4'b0000,
 64(原创)system verilog——uart发送模块的设计    UART_STARTBIT = 4'b0001,
 65(原创)system verilog——uart发送模块的设计    UART_BIT7 = 4'b0010,
 66(原创)system verilog——uart发送模块的设计    UART_BIT6 = 4'b0011,
 67(原创)system verilog——uart发送模块的设计    UART_BIT5 = 4'b0100,
 68(原创)system verilog——uart发送模块的设计    UART_BIT4 = 4'b0101,
 69(原创)system verilog——uart发送模块的设计    UART_BIT3 = 4'b0110,
 70(原创)system verilog——uart发送模块的设计    UART_BIT2 = 4'b0111,
 71(原创)system verilog——uart发送模块的设计    UART_BIT1 = 4'b1000,
 72(原创)system verilog——uart发送模块的设计    UART_BIT0 = 4'b1001,
 73(原创)system verilog——uart发送模块的设计    UART_STOPBIT = 4'b1010;
 74(原创)system verilog——uart发送模块的设计 
 75(原创)system verilog——uart发送模块的设计
 76(原创)system verilog——uart发送模块的设计logic [3:0]  c_state;
 77(原创)system verilog——uart发送模块的设计logic [3:0]  n_state;
 78(原创)system verilog——uart发送模块的设计 
 79(原创)system verilog——uart发送模块的设计 //sequencial logic
 80(原创)system verilog——uart发送模块的设计always_ff @ (posedge clk or posedge rst)
 81(原创)system verilog——uart发送模块的设计begin
 82(原创)system verilog——uart发送模块的设计   if (rst) 
 83(原创)system verilog——uart发送模块的设计      c_state <= UART_IDLE;   
 84(原创)system verilog——uart发送模块的设计   else  
 85(原创)system verilog——uart发送模块的设计      c_state <= n_state;   
 86(原创)system verilog——uart发送模块的设计end
 87(原创)system verilog——uart发送模块的设计//combinational logic
 88(原创)system verilog——uart发送模块的设计always_ff @ (c_state or ready or shift)
 89(原创)system verilog——uart发送模块的设计begin 
 90(原创)system verilog——uart发送模块的设计        case (c_state) //synopsys full_case
 91(原创)system verilog——uart发送模块的设计            UART_IDLE: begin
 92(原创)system verilog——uart发送模块的设计                if (ready ) begin
 93(原创)system verilog——uart发送模块的设计                    n_state <= UART_STARTBIT;
 94(原创)system verilog——uart发送模块的设计                    shift = 0;
 95(原创)system verilog——uart发送模块的设计                end
 96(原创)system verilog——uart发送模块的设计                else begin
 97(原创)system verilog——uart发送模块的设计                    n_state <= UART_IDLE;
 98(原创)system verilog——uart发送模块的设计                    shift = 0;
 99(原创)system verilog——uart发送模块的设计                end
100(原创)system verilog——uart发送模块的设计            end 
101(原创)system verilog——uart发送模块的设计            UART_STARTBIT: begin
102(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT7;    
103(原创)system verilog——uart发送模块的设计                    shift = 1;    
104(原创)system verilog——uart发送模块的设计                end
105(原创)system verilog——uart发送模块的设计            UART_BIT7: begin
106(原创)system verilog——uart发送模块的设计                if(shift) begin
107(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT6;    
108(原创)system verilog——uart发送模块的设计                    shift = 1;            
109(原创)system verilog——uart发送模块的设计                end
110(原创)system verilog——uart发送模块的设计                else begin
111(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT7;    
112(原创)system verilog——uart发送模块的设计                    shift = 0;
113(原创)system verilog——uart发送模块的设计                end
114(原创)system verilog——uart发送模块的设计            end
115(原创)system verilog——uart发送模块的设计            UART_BIT6: begin
116(原创)system verilog——uart发送模块的设计                if(shift) begin
117(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT5;    
118(原创)system verilog——uart发送模块的设计                    shift = 1;            
119(原创)system verilog——uart发送模块的设计                end
120(原创)system verilog——uart发送模块的设计                else begin
121(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT6;        
122(原创)system verilog——uart发送模块的设计                    shift = 0;
123(原创)system verilog——uart发送模块的设计                end
124(原创)system verilog——uart发送模块的设计            end
125(原创)system verilog——uart发送模块的设计            UART_BIT5: begin
126(原创)system verilog——uart发送模块的设计                if(shift) begin
127(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT4;        
128(原创)system verilog——uart发送模块的设计                    shift = 1;            
129(原创)system verilog——uart发送模块的设计
130(原创)system verilog——uart发送模块的设计                end
131(原创)system verilog——uart发送模块的设计                else begin
132(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT5;    
133(原创)system verilog——uart发送模块的设计                    shift = 0;
134(原创)system verilog——uart发送模块的设计                end
135(原创)system verilog——uart发送模块的设计            end
136(原创)system verilog——uart发送模块的设计            UART_BIT4: begin
137(原创)system verilog——uart发送模块的设计                if(shift) begin
138(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT3;    
139(原创)system verilog——uart发送模块的设计                    shift = 1;            
140(原创)system verilog——uart发送模块的设计
141(原创)system verilog——uart发送模块的设计                end
142(原创)system verilog——uart发送模块的设计                else begin
143(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT4;        
144(原创)system verilog——uart发送模块的设计                    shift = 0;
145(原创)system verilog——uart发送模块的设计                end
146(原创)system verilog——uart发送模块的设计            end
147(原创)system verilog——uart发送模块的设计            UART_BIT3: begin
148(原创)system verilog——uart发送模块的设计                if(shift) begin
149(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT2;    
150(原创)system verilog——uart发送模块的设计                    shift = 1;        
151(原创)system verilog——uart发送模块的设计                end
152(原创)system verilog——uart发送模块的设计                else    begin
153(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT3;    
154(原创)system verilog——uart发送模块的设计                    shift = 0;
155(原创)system verilog——uart发送模块的设计                end
156(原创)system verilog——uart发送模块的设计            end
157(原创)system verilog——uart发送模块的设计            UART_BIT2: begin
158(原创)system verilog——uart发送模块的设计                if(shift) begin
159(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT1;    
160(原创)system verilog——uart发送模块的设计                    shift = 1;            
161(原创)system verilog——uart发送模块的设计
162(原创)system verilog——uart发送模块的设计                end
163(原创)system verilog——uart发送模块的设计                else begin
164(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT2;        
165(原创)system verilog——uart发送模块的设计                    shift = 0;
166(原创)system verilog——uart发送模块的设计                end
167(原创)system verilog——uart发送模块的设计            end
168(原创)system verilog——uart发送模块的设计            UART_BIT1: begin
169(原创)system verilog——uart发送模块的设计                if(shift) begin
170(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT0;    
171(原创)system verilog——uart发送模块的设计                    shift = 1;            
172(原创)system verilog——uart发送模块的设计                end
173(原创)system verilog——uart发送模块的设计                else begin
174(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT1;        
175(原创)system verilog——uart发送模块的设计                    shift = 0;
176(原创)system verilog——uart发送模块的设计                end
177(原创)system verilog——uart发送模块的设计            end
178(原创)system verilog——uart发送模块的设计            UART_BIT0: begin
179(原创)system verilog——uart发送模块的设计                if(shift) begin
180(原创)system verilog——uart发送模块的设计                    n_state <= UART_STOPBIT;    
181(原创)system verilog——uart发送模块的设计                    shift = 1;        
182(原创)system verilog——uart发送模块的设计                end
183(原创)system verilog——uart发送模块的设计                else begin
184(原创)system verilog——uart发送模块的设计                    n_state <= UART_BIT0;        
185(原创)system verilog——uart发送模块的设计                    shift = 0;
186(原创)system verilog——uart发送模块的设计                end
187(原创)system verilog——uart发送模块的设计            end
188(原创)system verilog——uart发送模块的设计            UART_STOPBIT: begin
189(原创)system verilog——uart发送模块的设计                if(!ready) begin
190(原创)system verilog——uart发送模块的设计                    n_state <= UART_IDLE;    
191(原创)system verilog——uart发送模块的设计                    shift = 0;            
192(原创)system verilog——uart发送模块的设计                end
193(原创)system verilog——uart发送模块的设计                else if (ready) begin
194(原创)system verilog——uart发送模块的设计                    n_state <= UART_STARTBIT;
195(原创)system verilog——uart发送模块的设计                    shift = 0;            
196(原创)system verilog——uart发送模块的设计                end
197(原创)system verilog——uart发送模块的设计                else begin
198(原创)system verilog——uart发送模块的设计                    n_state <= UART_STOPBIT;
199(原创)system verilog——uart发送模块的设计                    shift = 0;            
200(原创)system verilog——uart发送模块的设计                end
201(原创)system verilog——uart发送模块的设计             end
202(原创)system verilog——uart发送模块的设计            defaultbegin
203(原创)system verilog——uart发送模块的设计                  n_state <= UART_IDLE;
204(原创)system verilog——uart发送模块的设计                   shift = 0;                    
205(原创)system verilog——uart发送模块的设计            end 
206(原创)system verilog——uart发送模块的设计      endcase
207(原创)system verilog——uart发送模块的设计end 
208(原创)system verilog——uart发送模块的设计
209(原创)system verilog——uart发送模块的设计
210(原创)system verilog——uart发送模块的设计//sva sequence description
211(原创)system verilog——uart发送模块的设计sequence s_state;
212(原创)system verilog——uart发送模块的设计(c_state==UART_STARTBIT) ##1(c_state==UART_BIT7) 
213(原创)system verilog——uart发送模块的设计##1(c_state==UART_BIT6) ##1(c_state==UART_BIT5) 
214(原创)system verilog——uart发送模块的设计##1(c_state==UART_BIT4) ##1(c_state==UART_BIT3) 
215(原创)system verilog——uart发送模块的设计##1(c_state==UART_BIT2) ##1(c_state==UART_BIT1) 
216(原创)system verilog——uart发送模块的设计##1(c_state==UART_BIT0) ##1(c_state==UART_STOPBIT);
217(原创)system verilog——uart发送模块的设计endsequence
218(原创)system verilog——uart发送模块的设计//sva property description
219(原创)system verilog——uart发送模块的设计property p_start; 
220(原创)system verilog——uart发送模块的设计 @(posedge clk)
221(原创)system verilog——uart发送模块的设计  load|=>ready ##2!txd;  
222(原创)system verilog——uart发送模块的设计endproperty
223(原创)system verilog——uart发送模块的设计property p_state; 
224(原创)system verilog——uart发送模块的设计 @(posedge clk)
225(原创)system verilog——uart发送模块的设计 ((!rst)&&ready)|=>s_state;
226(原创)system verilog——uart发送模块的设计endproperty
227(原创)system verilog——uart发送模块的设计property p_shift; 
228(原创)system verilog——uart发送模块的设计 @(posedge clk)
229(原创)system verilog——uart发送模块的设计 ((!rst)&&ready)|=>(shift[*9]); 
230(原创)system verilog——uart发送模块的设计endproperty
231(原创)system verilog——uart发送模块的设计
232(原创)system verilog——uart发送模块的设计//sva check
233(原创)system verilog——uart发送模块的设计[email protected](posedge clk)
234(原创)system verilog——uart发送模块的设计if(fifo_sva)
235(原创)system verilog——uart发送模块的设计begin
236(原创)system verilog——uart发送模块的设计a_start:assert property(p_start)           
237(原创)system verilog——uart发送模块的设计        else $display("start error at %d !",$time);
238(原创)system verilog——uart发送模块的设计a_state:assert property(p_state)
239(原创)system verilog——uart发送模块的设计        else $display("state machine error at %d !",$time);
240(原创)system verilog——uart发送模块的设计a_shift:assert property(p_shift)
241(原创)system verilog——uart发送模块的设计        else $display("shift error at %d !",$time);    
242(原创)system verilog——uart发送模块的设计c_start:cover property(p_start);
243(原创)system verilog——uart发送模块的设计c_c_state:cover property(p_state);
244(原创)system verilog——uart发送模块的设计c_shift:cover property(p_shift);
245(原创)system verilog——uart发送模块的设计end
246(原创)system verilog——uart发送模块的设计endmodule

247(原创)system verilog——uart发送模块的设计

 

testbench如下:

 

(原创)system verilog——uart发送模块的设计(原创)system verilog——uart发送模块的设计Code
 1(原创)system verilog——uart发送模块的设计`timescale 1ns/10ps
 2(原创)system verilog——uart发送模块的设计module uart_tx_testbench; 
 3(原创)system verilog——uart发送模块的设计    logic [7:0] din;
 4(原创)system verilog——uart发送模块的设计    logic load;
 5(原创)system verilog——uart发送模块的设计    logic clk;
 6(原创)system verilog——uart发送模块的设计    logic rst;
 7(原创)system verilog——uart发送模块的设计    wire txd;
 8(原创)system verilog——uart发送模块的设计    wire ready;
 9(原创)system verilog——uart发送模块的设计    wire[3:0] c_state;
10(原创)system verilog——uart发送模块的设计uart_tx  #(1)
11(原创)system verilog——uart发送模块的设计     uart_tx_inst(
12(原创)system verilog——uart发送模块的设计                  .din(din),
13(原创)system verilog——uart发送模块的设计                  .load(load),
14(原创)system verilog——uart发送模块的设计                  .clk(clk),
15(原创)system verilog——uart发送模块的设计                  .rst(rst),
16(原创)system verilog——uart发送模块的设计                  .txd(txd),
17(原创)system verilog——uart发送模块的设计                  .ready(ready),
18(原创)system verilog——uart发送模块的设计                  .c_state(c_state)
19(原创)system verilog——uart发送模块的设计);
20(原创)system verilog——uart发送模块的设计parameter p=10;
21(原创)system verilog——uart发送模块的设计initial
22(原创)system verilog——uart发送模块的设计begin
23(原创)system verilog——uart发送模块的设计   clk=1;
24(原创)system verilog——uart发送模块的设计   rst=1;
25(原创)system verilog——uart发送模块的设计   load=0;
26(原创)system verilog——uart发送模块的设计#1 rst=0;
27(原创)system verilog——uart发送模块的设计#p load=1;
28(原创)system verilog——uart发送模块的设计   din=8'b10101010;
29(原创)system verilog——uart发送模块的设计#p load=0;
30(原创)system verilog——uart发送模块的设计#p ;#p ;#p ;#p ;#p ;#p ;#p ;#p ;
31(原创)system verilog——uart发送模块的设计#p ;#p ;#p ;#p ;#p ;#p ;#p ;#p ;
32(原创)system verilog——uart发送模块的设计#p load=1;
33(原创)system verilog——uart发送模块的设计   din=8'b11001100;
34(原创)system verilog——uart发送模块的设计#p load=0;
35(原创)system verilog——uart发送模块的设计#p ;#p ;#p ;#p ;#p ;#p ;#p ;#p ;
36(原创)system verilog——uart发送模块的设计#p load=1;
37(原创)system verilog——uart发送模块的设计   din=8'b11110000;
38(原创)system verilog——uart发送模块的设计#p load=0;
39(原创)system verilog——uart发送模块的设计#1000 $finish;
40(原创)system verilog——uart发送模块的设计end
41(原创)system verilog——uart发送模块的设计initial
42(原创)system verilog——uart发送模块的设计begin
43(原创)system verilog——uart发送模块的设计$monitor("din=%b,txd=%b,time=%d",din,txd,$time);
44(原创)system verilog——uart发送模块的设计end
45(原创)system verilog——uart发送模块的设计always #5 clk=~clk;
46(原创)system verilog——uart发送模块的设计endmodule
47(原创)system verilog——uart发送模块的设计

 

以上代码都已通过调试,调试环境为modelsim6.3f

转载于:https://www.cnblogs.com/changlong/archive/2009/01/05/1369631.html