【问题标题】:Why result Q is X?为什么结果 Q 是 X?
【发布时间】:2016-12-28 10:47:05
【问题描述】:
  • 我正在使用 Xilinx 14.7 进行测试仿真。
  • 此代码是从 My Japanese Verilog Book 中自定义的。

Verilog 代码

module Q41(clk,q1,reset,q2);
        input clk,reset;
        output  [7:0] q1,q2;
        reg     [7:0] q1,q2;
        reg     a;
        always @(posedge clk or posedge reset)
        begin
            if(reset)
                begin
                a  <= 0 ;
                q1 <= 8'h0; 
                q2 <= 8'h0; 
                end 
            else if(a<=0)
                begin                       
                    if(q1>=8'h14)   
                        begin   q1  <= 8'h14;   a <= 1; end 
                    else                    
                        q1 <= q1+1;             
                end
            else  
                begin                       
                    if(q1<=8'h0)    
                        begin   q1 <= 8'h0;     a <= 0; end 
                    else                    
                        q1 <= q1-1;             
                end
            if(a<=0)
                q2 <=q2+q1;
            else
                q2 <=q2-q1;
        end
    endmodule

测试台

    `timescale 1ps/1ps
    module Q41TestBench;
        reg clk;
        reg reset;
        wire [7:0] q1;
        wire [7:0] q2;
        parameter step = 10000; // 10ns
        Q41 uut (clk, q1, reset, q2);
        always begin
            clk = 0; #(step/2);
            clk = 1;    #(step/2);
        end
        initial begin
                reset = 1;
        #step reset = 0;
        #step clk   = 0;
        #(step*100) $finish;
        end
        initial $monitor($stime,
        " clk = %d reset = %d Q = %d",clk,reset,q2);
    endmodule

结果

查看结果图片

【问题讨论】:

    标签: verilog simulation system-verilog xilinx hdl


    【解决方案1】:

    您的问题是您将 Q2 放在两个单独的结构中。您在传统的 IF(reset) 中有 Q2 重置,然后您有一个单独的 IF 管理 Q2 的分配。我将推荐以下重新编码,其中 q2 位于相同的 IF 构造中。

    if(reset)
        begin
           a  <= 0 ;
           q1 <= 8'h0; 
           q2 <= 8'h0; 
        end 
    else if(a<=0) 
        begin 
           q2 <= q2+q1                      
           if(q1>=8'h14)   
               begin   
               q1 <= 8'h14;  
               a  <= 1; 
               end 
           else
               begin                 
               q1 <= q1+1;
               a <= a; // I like to make sure that everything is always assigned   
               end          
        end
    else  
        begin 
           q2 <=q2-q1;                      
           if(q1<=8'h0)    
              begin   
              q1 <= 8'h0;     
              a <= 0; 
              end 
           else
              begin                    
              q1 <= q1-1;
              a <= a;
              end             
        end
    

    【讨论】:

    • 只是为了增加一个理性,在您的原始代码中,如果模块处于重置状态,则 q2
    猜你喜欢
    • 2013-08-17
    • 1970-01-01
    • 2012-09-20
    • 2015-09-14
    • 2021-05-03
    • 2014-03-19
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多