@@ -446,18 +446,18 @@ class MmuHDL extends Module {
446446 ]);
447447 }
448448
449- List <Conditional > defineReadPort (
449+ List <Iff > defineReadPort (
450450 MemoryAccess access,
451451 DataPortInterface readPort,
452452 int id,
453453 ) => [
454454 if (config.hasPaging)
455- If (
455+ Iff (
456456 readPort.en &
457457 ~ devReadBusy &
458458 devReadClaim.eq (0 ) &
459459 needsPageTranslation,
460- then : [
460+ [
461461 ptwEnable < 1 ,
462462 ptwVaddr < readPort.addr,
463463 ptwAccess <
@@ -485,9 +485,9 @@ class MmuHDL extends Module {
485485 ),
486486 ],
487487 ),
488- If (
488+ Iff (
489489 readPort.en & ~ devReadBusy & devReadClaim.eq (0 ) & ~ needsPageTranslation,
490- then : [
490+ [
491491 devReadEnable < 1 ,
492492 devReadBusy < 1 ,
493493 devReadClaim < id,
@@ -497,32 +497,38 @@ class MmuHDL extends Module {
497497 readPort.data < 0 ,
498498 ],
499499 ),
500- If (
501- devReadBusy & devReadClaim.eq (id),
502- then: [
503- readPort.done < devReadDone,
504- readPort.valid < devReadValid,
505- readPort.data < devReadData,
506- If (
507- devReadDone & ~ readPort.en,
508- then: [devReadBusy < 0 , devReadClaim < 0 , devReadEnable < 0 ],
509- ),
510- ],
511- ),
500+ Iff (readPort.en & devReadBusy & devReadClaim.eq (id) & devReadDone, [
501+ readPort.done < devReadDone,
502+ readPort.valid < devReadValid,
503+ readPort.data < devReadData,
504+ ]),
505+ Iff (devReadBusy & devReadClaim.eq (id) & (~ readPort.en | devReadDone), [
506+ readPort.done < 0 ,
507+ readPort.valid < 0 ,
508+ readPort.data < 0 ,
509+ devReadBusy < 0 ,
510+ devReadClaim < 0 ,
511+ devReadEnable < 0 ,
512+ ]),
513+ ElseIf (devReadBusy & devReadClaim.eq (id), [
514+ readPort.done < 0 ,
515+ readPort.valid < 0 ,
516+ readPort.data < 0 ,
517+ ]),
512518 ];
513519
514- List <Conditional > defineWritePort (
520+ List <Iff > defineWritePort (
515521 MemoryAccess access,
516522 DataPortInterface writePort,
517523 int id,
518524 ) => [
519525 if (config.hasPaging)
520- If (
526+ Iff (
521527 writePort.en &
522528 ~ devWriteBusy &
523529 devWriteClaim.eq (0 ) &
524530 needsPageTranslation,
525- then : [
531+ [
526532 ptwEnable < 1 ,
527533 ptwAccess <
528534 switch (access) {
@@ -547,30 +553,27 @@ class MmuHDL extends Module {
547553 ),
548554 ],
549555 ),
550- If (
556+ Iff (
551557 writePort.en &
552558 ~ devWriteBusy &
553559 devWriteClaim.eq (0 ) &
554560 ~ needsPageTranslation,
555- then : [
561+ [
556562 devWriteEnable < 1 ,
557563 devWriteBusy < 1 ,
558564 devWriteClaim < id,
559565 devWriteAddr < writePort.addr,
560566 devWriteData < writePort.data,
561567 ],
562568 ),
563- If (
564- devWriteBusy & devWriteClaim.eq (id),
565- then: [
566- writePort.done < devWriteDone,
567- writePort.valid < devWriteValid,
568- If (
569- devWriteDone & ~ writePort.en,
570- then: [devWriteBusy < 0 , devWriteClaim < 0 , devWriteEnable < 0 ],
571- ),
572- ],
573- ),
569+ Iff (devWriteBusy & devWriteClaim.eq (id), [
570+ writePort.done < devWriteDone,
571+ writePort.valid < devWriteValid,
572+ If (
573+ devWriteDone & ~ writePort.en,
574+ then: [devWriteBusy < 0 , devWriteClaim < 0 , devWriteEnable < 0 ],
575+ ),
576+ ]),
574577 ];
575578
576579 Sequential (clk, [
@@ -605,18 +608,25 @@ class MmuHDL extends Module {
605608 ],
606609 orElse: [
607610 ...pagingCycle,
608- for (final memReadPort in memReadPorts.indexed)
609- ...defineReadPort (
610- memReadPort.$2.$1,
611- memReadPort.$2.$2,
612- memReadPort.$1 + 2 ,
613- ),
614- for (final memWritePort in memWritePorts.indexed)
615- ...defineWritePort (
616- memWritePort.$2.$1,
617- memWritePort.$2.$2,
618- memWritePort.$1 + 2 ,
619- ),
611+ for (final memPort in [
612+ ...memReadPorts,
613+ ...memWritePorts,
614+ ].map ((e) => e.$2))
615+ If (~ memPort.en, then: [memPort.done < 0 , memPort.valid < 0 ]),
616+ If .block ([
617+ for (final memReadPort in memReadPorts.indexed)
618+ ...defineReadPort (
619+ memReadPort.$2.$1,
620+ memReadPort.$2.$2,
621+ memReadPort.$1 + 2 ,
622+ ),
623+ for (final memWritePort in memWritePorts.indexed)
624+ ...defineWritePort (
625+ memWritePort.$2.$1,
626+ memWritePort.$2.$2,
627+ memWritePort.$1 + 2 ,
628+ ),
629+ ]),
620630 If (
621631 devReadEnable,
622632 then: [
@@ -639,7 +649,8 @@ class MmuHDL extends Module {
639649 width: config.mxlen.size,
640650 ))
641651 .slice (dev.value.$1.addr.width - 1 , 0 ),
642- devReadData < dev.value.$1.data,
652+ devReadData <
653+ dev.value.$1.data.zeroExtend (config.mxlen.size),
643654 devReadDone < dev.value.$1.done,
644655 devReadValid < dev.value.$1.valid,
645656 ],
@@ -670,7 +681,8 @@ class MmuHDL extends Module {
670681 width: config.mxlen.size,
671682 ))
672683 .slice (dev.value.$2.addr.width - 1 , 0 ),
673- dev.value.$2.data < devWriteData,
684+ dev.value.$2.data <
685+ devWriteData.slice (dev.value.$2.data.width - 1 , 0 ),
674686 devWriteDone < dev.value.$2.done,
675687 devWriteValid < dev.value.$2.valid,
676688 If (dev.value.$2.done, then: [dev.value.$2.en < 0 ]),
0 commit comments