summaryrefslogtreecommitdiff
path: root/tb/avalon.impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--tb/avalon.impl.hpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/tb/avalon.impl.hpp b/tb/avalon.impl.hpp
index 3173af8..5ba514f 100644
--- a/tb/avalon.impl.hpp
+++ b/tb/avalon.impl.hpp
@@ -52,7 +52,14 @@ namespace taller::avalon
}
return true;
- } else if(!active)
+ }
+
+ for(auto &binding : devices)
+ {
+ binding.dev.tick();
+ }
+
+ if(!active)
{
avl_address = plat.avl_address;
avl_read = plat.avl_read;
@@ -77,6 +84,8 @@ namespace taller::avalon
if(!active)
{
+ bail();
+
const char *op = avl_read ? "read" : "write";
fprintf(stderr, "[avl] attempt to %s memory hole at 0x%08x\n", op, avl_address);
return false;
@@ -84,6 +93,8 @@ namespace taller::avalon
if(avl_address & active->word_mask())
{
+ bail();
+
fprintf(stderr, "[avl] unaligned address: 0x%08x\n", avl_address);
return false;
}
@@ -105,6 +116,15 @@ namespace taller::avalon
}
template<class Platform>
+ void interconnect<Platform>::bail() noexcept
+ {
+ for(auto &binding : devices)
+ {
+ binding.dev.bail();
+ }
+ }
+
+ template<class Platform>
std::uint32_t interconnect<Platform>::dump(std::uint32_t addr)
{
std::uint32_t avl_address = addr << 2;