こんにちは。
フラグ処理のコードを書いています。
wire_ack_acquirememt_bus[object_numb][wire_wsr_num]
はwire_wsr_num行の中で一つだけアサートすることになっています。
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
で送信者がアサートさせているフラグを拾い、列番号object_numbをピックアップします。
後半コードでその列から若い列、古い列へフラグを埋めていきます(flag_fill(fill_data, fill_target, fill_width, fill_start_bit))。
VC++8でトレースして追ってみているのですが、挙動がおかしく、その問題点を探しているのですが、私には見つけることが出来ませんでした。
flag_pick()、flag_fill()も公開する必要があると思いますが、まずは下記のコードで分かることを教えていただけないでしょうか。
/* ACKNOWLEDGE for ACQUIREMENT */
i = 0;
sender_no_ack_acq_bus[wire_wsr_num] = 0;
for (wire_wsr_num=0; wire_wsr_num<WSRF_SIZE; wire_wsr_num++)
{
prev_sender_no_ack_acq_bus[wire_wsr_num] = sender_no_ack_acq_bus[wire_wsr_num];
for (object_numb=0; object_numb<SPACE_SIZE; object_numb++)
{
ack_sender = flag_pick(wire_ack_acquirememt_bus[object_numb][wire_wsr_num], 1, SEND_ON_BUS);
if (ack_sender == ASSERT)
{
sender_no_ack_acq_bus[wire_wsr_num] = object_numb;
i = i | ASSERT;
}
}
if (object_numb == SPACE_SIZE && i == NEGATE)
{
wire_reset = NEGATE;
sender_no_ack_acq_bus[wire_wsr_num] = prev_sender_no_ack_acq_bus[wire_wsr_num];
}
else
wire_reset = ASSERT;
wire_temp_ack_acq_bus = flag_pick(wire_ack_acquirememt_bus[sender_no_ack_acq_bus[wire_wsr_num]][wire_wsr_num], 1, SEND_ON_BUS);
wire_event_temp_ack_acq_bus = ff_event_check(&ff_event_temp_ack_acq_bus, 0, &ff_event_holder_temp_ack_acq_bus, 0, wire_temp_ack_acq_bus, 0);
wire_event_temp_ack_bus_assert = wire_event_temp_ack_acq_bus & wire_temp_ack_acq_bus & 1;
wire_event_temp_ack_bus_negate = wire_event_temp_ack_acq_bus & ~wire_temp_ack_acq_bus & 1;
for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb>0; object_numb--)
{
wire_ack_acquirememt_bus[object_numb -1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num -1], 1, 0);
}
for (object_numb=sender_no_ack_acq_bus[wire_wsr_num]; object_numb<SPACE_SIZE-1; object_numb++)
{
wire_ack_acquirememt_bus[object_numb +1][wire_wsr_num] = flag_fill(wire_temp_ack_acq_bus & ~wire_event_temp_ack_bus_negate & wire_reset & 1, wire_ack_acquirememt_bus[object_numb][wire_wsr_num +1], 1, 0);
}
}
ff_event_check()はソースのアサートとネゲートイベントで1を返し続けます。
編集 削除