Цитата(XVR @ Jul 12 2012, 21:16)

Нет
Насколько я помню стандарт (давненько это было, увы) адрес в транзакции указывается 1 раз. Так что пока транзакция не кончится, она должна ложиться по последовательным адресам (если вы конечно не в IO пространство пишете)
Пробовал... ситуация такая - по signaltab видно, что в соответствии со стандартом пачка должна быть отправлена с моей стороны, но на стороне линукса считывается чушь, а вернее 1 слово почти всегда верно, а остальные выдаются 0... причем 0 - это данные, которыми я управляю вот так:
CODE
//выставление данных на шину АД PCI
assign l_adi = (rdWorkInf == 1)? WorkInf: (fl_adr == 1)? adress: (EnableWritePCIMaster == 1 && StatePCI == 0)? SumOfCountForPCI: (StatePCI == 4)? DataForPCI:(StatePCI == 6)? 32'hFACE_DEAD: ( StatePCI == 7 || StatePCI == 2 || StatePCI == 3 || StatePCI == 5)? WorkDataForPCI: 32'h0000_0000;
если я меняю 32'h0000_0000 на другое значение, то вместо 0 на стороне линукс появляется это значение....
под Линукс сделан лог того, что происходит... по приему прерывания от меня считывается 40 слов с того адреса, что мне выдавался на шину
лог такой:
CODE
57.282587] e_bus: got_irq irq=17 dev_id=f61d2800 minor=0
[ 57.282587] e_bus: e_bus_read f=ed7949c0, buf=775da008, size = 40000000h, loff=eb3edf98
[ 57.282589] e_bus: First word: 24h (36) from eb3f0000
[ 57.282626] e_bus: e_bus_buf[0] = 0h from eb3f0000
[ 57.282627] e_bus: e_bus_buf[1] = 0h from eb3f0004
[ 57.282629] e_bus: e_bus_buf[2] = 0h from eb3f0008
[ 57.282630] e_bus: e_bus_buf[3] = 0h from eb3f000c
[ 57.282631] e_bus: e_bus_buf[4] = 0h from eb3f0010
[ 57.282632] e_bus: e_bus_buf[5] = 0h from eb3f0014
[ 57.282634] e_bus: e_bus_buf[6] = 0h from eb3f0018
[ 57.282635] e_bus: e_bus_buf[7] = 0h from eb3f001c
[ 57.282636] e_bus: e_bus_buf[8] = 0h from eb3f0020
[ 57.282638] e_bus: e_bus_buf[9] = 0h from eb3f0024
[ 57.282639] e_bus: e_bus_buf[10] = 0h from eb3f0028
[ 57.282640] e_bus: e_bus_buf[11] = 0h from eb3f002c
[ 57.282641] e_bus: e_bus_buf[12] = 0h from eb3f0030
[ 57.282643] e_bus: e_bus_buf[13] = 0h from eb3f0034
[ 57.282644] e_bus: e_bus_buf[14] = 0h from eb3f0038
[ 57.282645] e_bus: e_bus_buf[15] = 0h from eb3f003c
[ 57.282646] e_bus: e_bus_buf[16] = 0h from eb3f0040
[ 57.282648] e_bus: e_bus_buf[17] = 0h from eb3f0044
[ 57.282649] e_bus: e_bus_buf[18] = 0h from eb3f0048
[ 57.282650] e_bus: e_bus_buf[19] = 0h from eb3f004c
[ 57.282652] e_bus: e_bus_buf[20] = 0h from eb3f0050
[ 57.282653] e_bus: e_bus_buf[21] = 0h from eb3f0054
[ 57.282654] e_bus: e_bus_buf[22] = 0h from eb3f0058
[ 57.282655] e_bus: e_bus_buf[23] = 0h from eb3f005c
[ 57.282657] e_bus: e_bus_buf[24] = 0h from eb3f0060
[ 57.282658] e_bus: e_bus_buf[25] = 0h from eb3f0064
[ 57.282659] e_bus: e_bus_buf[26] = 0h from eb3f0068
[ 57.282661] e_bus: e_bus_buf[27] = 0h from eb3f006c
[ 57.282662] e_bus: e_bus_buf[28] = 0h from eb3f0070
[ 57.282663] e_bus: e_bus_buf[29] = 0h from eb3f0074
[ 57.282665] e_bus: e_bus_buf[30] = 0h from eb3f0078
[ 57.282666] e_bus: e_bus_buf[31] = 0h from eb3f007c
[ 57.282667] e_bus: e_bus_buf[32] = 0h from eb3f0080
[ 57.282668] e_bus: e_bus_buf[33] = 0h from eb3f0084
[ 57.282670] e_bus: e_bus_buf[34] = 0h from eb3f0088
[ 57.282671] e_bus: e_bus_buf[35] = 0h from eb3f008c
[ 57.282672] e_bus: e_bus_buf[36] = 0h from eb3f0090
[ 57.282673] e_bus: e_bus_buf[37] = 0h from eb3f0094
[ 57.282675] e_bus: e_bus_buf[38] = 0h from eb3f0098
[ 57.282676] e_bus: e_bus_buf[39] = 0h from eb3f009c
[ 57.282677] e_bus: Last word: 0h
видно, что First word: 24h (36), что соответствует действительности... но остальное...
причем иногда, но совсем редко можно получить такой пакет, что примерно соответствует правде
CODE
[ 57.581310] e_bus: got_irq irq=17 dev_id=f602d000 minor=0
[ 57.581313] e_bus: e_bus_read f=eb360900, buf=77590008, size = 40000000h, loff=eb2a7f98
[ 57.581315] e_bus: First word: 6ch (108) from eb378000
[ 57.581330] e_bus: got_irq irq=17 dev_id=f602d000 minor=0
[ 57.581354] e_bus: e_bus_buf[0] = 24h from eb378000
[ 57.581356] e_bus: e_bus_buf[1] = 1h from eb378004
[ 57.581357] e_bus: e_bus_buf[2] = 5h from eb378008
[ 57.581358] e_bus: e_bus_buf[3] = 20h from eb37800c
[ 57.581360] e_bus: e_bus_buf[4] = FFFF0000h from eb378010
[ 57.581361] e_bus: e_bus_buf[5] = 20001h from eb378014
[ 57.581362] e_bus: e_bus_buf[6] = 40003h from eb378018
[ 57.581364] e_bus: e_bus_buf[7] = 60005h from eb37801c
[ 57.581365] e_bus: e_bus_buf[8] = 80007h from eb378020
[ 57.581366] e_bus: e_bus_buf[9] = A0009h from eb378024
[ 57.581368] e_bus: e_bus_buf[10] = 0h from eb378028
[ 57.581369] e_bus: e_bus_buf[11] = 0h from eb37802c
[ 57.581370] e_bus: e_bus_buf[12] = 0h from eb378030
[ 57.581372] e_bus: e_bus_buf[13] = 0h from eb378034
[ 57.581373] e_bus: e_bus_buf[14] = 0h from eb378038
[ 57.581374] e_bus: e_bus_buf[15] = 0h from eb37803c
[ 57.581375] e_bus: e_bus_buf[16] = 0h from eb378040
[ 57.581377] e_bus: e_bus_buf[17] = 0h from eb378044
[ 57.581378] e_bus: e_bus_buf[18] = 0h from eb378048
[ 57.581379] e_bus: e_bus_buf[19] = 0h from eb37804c
[ 57.581381] e_bus: e_bus_buf[20] = 0h from eb378050
[ 57.581382] e_bus: e_bus_buf[21] = 0h from eb378054
[ 57.581383] e_bus: e_bus_buf[22] = 0h from eb378058
[ 57.581384] e_bus: e_bus_buf[23] = 0h from eb37805c
[ 57.581386] e_bus: e_bus_buf[24] = 0h from eb378060
[ 57.581387] e_bus: e_bus_buf[25] = 0h from eb378064
[ 57.581388] e_bus: e_bus_buf[26] = 0h from eb378068
[ 57.581390] e_bus: e_bus_buf[27] = 0h from eb37806c
[ 57.581391] e_bus: e_bus_buf[28] = 0h from eb378070
[ 57.581392] e_bus: e_bus_buf[29] = 0h from eb378074
[ 57.581394] e_bus: e_bus_buf[30] = 0h from eb378078
[ 57.581395] e_bus: e_bus_buf[31] = 0h from eb37807c
[ 57.581396] e_bus: e_bus_buf[32] = 0h from eb378080
[ 57.581398] e_bus: e_bus_buf[33] = 0h from eb378084
[ 57.581399] e_bus: e_bus_buf[34] = 0h from eb378088
[ 57.581400] e_bus: e_bus_buf[35] = 0h from eb37808c
[ 57.581401] e_bus: e_bus_buf[36] = 0h from eb378090
[ 57.581403] e_bus: e_bus_buf[37] = 0h from eb378094
[ 57.581404] e_bus: e_bus_buf[38] = 0h from eb378098
[ 57.581405] e_bus: e_bus_buf[39] = 0h from eb37809c
[ 57.581406] e_bus: Last word: 0h
[ 57.581407] e_bus: wrong signature 0h (0), expected 0xFACEDEAD
т.е. данные примерно правильные до строки [ 57.581368] e_bus: e_bus_buf[10] = 0h from eb378028
Почему так происходит не понимаю.... причем от меня все уходит хорошо....
Кстати, у меня возник такой вопрос, для того чтобы сигнал готовности от меня(irdy) был неактивен там, где я хочу, надо сигнал lm_rdyn на локальной стороне выставлять за такт до тех данных, которые я не хочу чтобы попали но сторону PCI, хотя по диаграмме надо выставлять в том же такте, что и безразличные данные...
Сигнал lm_last так же высталяется в тот же момент, что и ты заканчиваешь передачу... а на диаграмме нарисовано что за такт до последних данных...
Я приложил диаграммы с signaltab, где на
1й картинке, как я работаю с локальной стороной и что в этот момент происходит на шине PCI
на 2й картинке, начало этой же транзакции, но увеличено для того, чтобы можно видеть было, что я передаю
на 3й картинке, конец этой же транзакции, но увеличено для того, чтобы можно видеть было, что я передаю
Сейчас управляющие сигналы и данные у меня выставляются так:
CODE
//выставление данных на шину АД PCI
assign l_adi = (rdWorkInf == 1)? WorkInf: (fl_adr == 1)? adress: (EnableWritePCIMaster == 1 && StatePCI == 0)? SumOfCountForPCI: (StatePCI == 4)? DataForPCI:(StatePCI == 6)? 32'hFACE_DEAD: ( StatePCI == 7 || StatePCI == 2 || StatePCI == 3 || StatePCI == 5)? WorkDataForPCI: 32'h0000_0000;
assign lm_rdyn = ((StatePCI == 0 || (StatePCI == 4 && CurrentIndexOfCounting >= localMaxCounting)) && lm_ackn == 0) ? 1'b1: (StatePCI_Wr == 4 && lm_ackn == 0)? 1'b0: 1'b1;
assign lm_lastn = (lm_ackn == 0 && /*(StatePCI == 1 && (localIndexSumOfCounting >= localMaxSumOfCount))*/StatePCI == 6)? 1'b0:1'b1;
пробовал синхронизировать данные сигналы для того, чтобы хоть что-то получить на стороне ПК из того, что я реально передаю, вот таким образом:
CODE
reg [31:0] ladi;
assign l_adi = ladi;
always @(*)
begin
if(Res == 0) ladi <= 32'h0000_0000;
else if (rdWorkInf == 1) ladi <= WorkInf;
else if (fl_adr == 1) ladi <= adress;
else case(StatePCI)
0: if(EnableWritePCIMaster == 0) ladi <= SumOfCountForPCI;
7: ladi <= WorkDataForPCI;
2: ladi <= WorkDataForPCI;
3: ladi <= WorkDataForPCI;
5: ladi <= WorkDataForPCI;
4: ladi <= DataForPCI;
6: ladi <= 32'hFACE_DEAD;
endcase
end*/
/*
reg lmrdyn;
// выставление сигнала готовности на стороне мастера
always @(posedge ClkPCI or negedge Res)
begin
if(Res == 0) lmrdyn <= 1;
else if(StatePCI == 0) lmrdyn <= 1; // ставим задержку в передаче при передаче на сторону PCI
else if (StatePCI == 4 && CurrentIndexOfCounting >= localMaxCounting) lmrdyn <= 1;
else if(lm_ackn == 0 && StatePCI_Wr == 4 ) lmrdyn <= 0;
else lmrdyn <= 1;
end */
/*lmlastn;
always @(posedge ClkPCI or negedge Res)
begin
if(Res == 0) lmlastn <= 1;
else case(StatePCI)
1: if(lm_ackn == 0 && (localIndexSumOfCounting >= localMaxSumOfCount)) lmlastn <= 0; //последняя пачка
default: lmlastn <= 1;
endcase
end */
Но результаты те же....
Я пробовал менять настройки pcicore, но ничего не получилось...
Вопрос:
Куда мне двигаться дальше?)))) На что обратить внимание?