If I understand correctly, it sounds like you are using the tags correctly. If so, I am not sure that your issue is tag related.
To summarize tag usage:
(1) When you receive a memory read request, the response you send back must be marked with the same tag as the request that you are responding to.
(2) Since there is not a response associated with a memory write request, sending a memory write request with a tag of zero is just find.
(3) When you send a memory read request, you need to make sure there are no outstanding requests marked with the same tag. That is, you can not reuse a tag from a memory read request until you have received the memory read response for that request.