Jump to content

    
Sign in to follow this  
MaratZuev

В чём смысл такого сравнения?

Recommended Posts

Всем добра.

Продолжаю разбирать чужое добро и наткнулся на такой кусок кода:

input [25:0] a_cpu;
input cs_cpu;
reg ena;

always @(negedge cs_cpu)
    if (a_cpu[21:0] >= 22'h0)
        ena <= 1'b1;
    else
        ena <= 1'b0;

Не понятно, а что: возможны варианты, когда if отработает по ветви a_cpu[21:0] < 22'h0 ? 

Share this post


Link to post
Share on other sites

Приветствую!

8 minutes ago, MaratZuev said:

Не понятно, а что: возможны варианты, когда if отработает по ветви a_cpu[21:0] < 22'h0 ? 

В симуляторе запросто   -  любой бит a_cpu  может быть равен X или Z.

Удачи! Rob.

Share this post


Link to post
Share on other sites
9 minutes ago, MaratZuev said:

Всем добра.

Продолжаю разбирать чужое добро и наткнулся на такой кусок кода:


input [25:0] a_cpu;
input cs_cpu;
reg ena;

always @(negedge cs_cpu)
    if (a_cpu[21:0] >= 22'h0)
        ena <= 1'b1;
    else
        ena <= 1'b0;

Не понятно, а что: возможны варианты, когда if отработает по ветви a_cpu[21:0] < 22'h0 ? 

a_cpu[21:0] = 'U' или 'Z' может быть?

Share this post


Link to post
Share on other sites

Судя по коду, просто предположение 

Вход со знаком, там еще 4 бита висит, и возможно автор кода сделал ошибку при проверке на отрицательные числа или что-то еще.

Было явно указано 22 бита, при 26-ти битном входе, без использования кастинга.

Share this post


Link to post
Share on other sites
`timescale 1ns / 1ns

module cmp;

    reg [25:0] a_cpu;
    reg cs_cpu;
    reg ena;

    always @(negedge cs_cpu)
            if (a_cpu[21:0] >= 22'h0)
                ena <= 1'b1;
            else
                ena <= 1'b0;
    
    initial begin
        cs_cpu = 1'b0;
        forever #10 cs_cpu = ~cs_cpu;
    end
    
    initial begin
        #5 a_cpu  = 25'h0000000;
        #20 a_cpu = 25'h3ffffff;
        #20 a_cpu = 25'hzzzzzzz;
        #20 a_cpu = 25'hxxxxxxx;
    end
    
    initial
        #100 $stop;
        
    initial
        $monitor("Time = %2t, a_cpu = 0x%7h, ena = b%0b", $stime, a_cpu, ena);
            
endmodule     

Даёт 

# Time =  0, a_cpu = 0xxxxxxxx, ena = b0
# Time =  5, a_cpu = 0x0000000, ena = b0
# Time = 20, a_cpu = 0x0000000, ena = b1
# Time = 25, a_cpu = 0x1ffffff, ena = b1
# Time = 45, a_cpu = 0xZzzzzzz, ena = b1
# Time = 60, a_cpu = 0xZzzzzzz, ena = b0
# Time = 65, a_cpu = 0xXxxxxxx, ena = b0

И

Clipboard01.thumb.gif.cf90bb0fad5b279ee4dd35bb9995731e.gif

Да, действительно, нижняя ветвь имеет место быть хотя бы в симуляторе. Всем спасибо.

Единственный вопрос: почему в строке 

# Time = 25, a_cpu = 0x1ffffff, ena = b1

a_cpu равен 0x1ffffff, а не 0x3ffffff, как задано?

Share this post


Link to post
Share on other sites
1 hour ago, MaratZuev said:

Не понятно, а что: возможны варианты, когда if отработает по ветви a_cpu[21:0] < 22'h0 ? 

а a_cpu[21:0] может быть воспринято как отрицательное число?

Или оно unsigned по умолчание?

Share this post


Link to post
Share on other sites
15 minutes ago, MaratZuev said:

Единственный вопрос: почему в строке 

# Time = 25, a_cpu = 0x1ffffff, ena = b1

a_cpu равен 0x1ffffff, а не 0x3ffffff, как задано?

Потому что 0x3ffffff это 26-ти битное число, а 25'h3ffffff - 25-ти битное. Старший бит в это число не помещается..

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this