diff options
Diffstat (limited to 'tb/avalon.impl.hpp')
| -rw-r--r-- | tb/avalon.impl.hpp | 22 |
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; |
