die("WO-RO type unsupported yet ("..field.name..")");
elseif(field.access==ACC_RW_RW)then
-- dual-write bitfield (both from the bus and the device)
if(field.load==LOAD_EXT)then
-- external load type (e.g. the register itself is placed outside the WB slave, which only outputs new value and asserts the "load" signal for single clock cycle upon bus write.
field.ports={port(BIT,0,"out",prefix.."_o","Ports for BIT field: '"..field.name.."' in reg: '"..reg.name.."'"),
field.ports={port(BIT,0,"out",prefix.."_o","Port for asynchronous (clock: "..field.clock..") BIT field: '"..field.name.."' in reg: '"..reg.name.."'")};
die("WO-RO type unsupported yet ("..field.name..")");
end
end
end
-- generates the bit-range for accessing a certain register field from WB-bus
functionvir(name,field)
localsyn={};
syn.t="index";
syn.name=name;
syn.h=field.offset+field.size-1;
syn.l=field.offset;
returnsyn;
end
-- generates code for slv, signed or unsigned fields
functiongen_hdl_code_slv(field,reg)
localprefix=gen_hdl_field_prefix(field,reg);
field.prefix=prefix;
-- synchronous signed/unsigned/slv field
if(field.clock==nil)then
if(field.access==ACC_RW_RO)then
-- bus(read-write), dev(read-only) slv
field.ports={port(field.type,field.size,"out",prefix.."_o","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'")};
field.ports={port(field.type,field.size,"in",prefix.."_i","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'")};
die("Only external load is supported for RW/RW slv/signed/unsigned fields");
end
field.ports={port(field.type,field.size,"out",prefix.."_o","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'"),
die("WO-RO type unsupported yet ("..field.name..")");
elseif(field.access==ACC_RW_RW)then
-- dual-write bitfield (both from the bus and the device)
if(field.load==LOAD_EXT)then
-- external load type (e.g. the register itself is placed outside the WB slave, which only outputs new value and asserts the "load" signal for single clock cycle upon bus write.
field.ports={port(BIT,0,"out",prefix.."_o","Ports for BIT field: '"..field.name.."' in reg: '"..reg.name.."'"),
field.ports={port(BIT,0,"out",prefix.."_o","Port for asynchronous (clock: "..field.clock..") BIT field: '"..field.name.."' in reg: '"..reg.name.."'")};
die("WO-RO type unsupported yet ("..field.name..")");
end
end
end
-- generates the bit-range for accessing a certain register field from WB-bus
functionvir(name,field)
localsyn={};
syn.t="index";
syn.name=name;
syn.h=field.offset+field.size-1;
syn.l=field.offset;
returnsyn;
end
-- generates code for slv, signed or unsigned fields
functiongen_hdl_code_slv(field,reg)
localprefix=gen_hdl_field_prefix(field,reg);
field.prefix=prefix;
-- synchronous signed/unsigned/slv field
if(field.clock==nil)then
if(field.access==ACC_RW_RO)then
-- bus(read-write), dev(read-only) slv
field.ports={port(field.type,field.size,"out",prefix.."_o","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'")};
field.ports={port(field.type,field.size,"in",prefix.."_i","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'")};
die("Only external load is supported for RW/RW slv/signed/unsigned fields");
end
field.ports={port(field.type,field.size,"out",prefix.."_o","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'"),
@@ -342,10 +333,10 @@ function gen_vhdl_code_slv(field, reg)
field.ports={port(field.type,field.size,"out",prefix.."_o","Port for "..fieldtype_2_vhdl[field.type].." field: '"..field.name.."' in reg: '"..reg.name.."'")};