There is a procedural continuous assignment type of statements that have precedence over any procedural statements. These are
assign statements inside
Referring to example in SystemVerilog LRM 1800-2012 Section 10.6,
The assign procedural continuous assignment statement shall override all procedural assignments to a variable. The deassign procedural statement shall end a procedural continuous assignment to a variable.
The value of the variable shall remain the same until the variable is assigned a new value through a procedural assignment or a procedural continuous assignment.
So, you can have a combinational
always block to override the existing value:
//... Some logic
assign ram[address] = whatever_data
// assign ram[address] = 'h1000;
always@ (posedge clk, negedge reset)
// No change here.
A new continuous assignment process is created when the line is reached in the procedural block.
assign can be applied to all the types like
integer etc but not on nets (force must be used for nets).
Moreover, procedural continuous assignments are synthesizable.
However, they can easily be misused and hence they must be used sparingly. A better alternative is to find out some other driving logic.
For more information, refer to this and this links. While, procedural continuous assignment can be found out at SystemVerilog LRM IEEE 1800-2012 section 10.6.