bit select,  part select,  concatenation

A bit select is selecting one bit of a signal.
Example:
For a 8-bit signal declared as,
wire [7:0] signal_a;
and a 4-bit signal declared as,
wire [3:0] signal_b;
the signal assignment statement,
assign signal_b[3] = signal_a[7];
takes a bit select of signal_a, selecting bit 7 of the signal, and assigning the value of that bit to bit 3 of signal_b.

A part select is selecting multiple bits of a signal.
Example:
For a 8-bit signal declared as,
wire [7:0] signal_a;
and a 4-bit signal declared as,
wire [3:0] signal_b;
the signal assignment statement,
assign signal_b[3:2] = signal_a[7:6];
takes a part select of signal_a, selecting bit 7 and bit 6 of signal_a, and assigning the value of bit 7 of signal_a to bit 3 of signal_b and assigning the value of bit 6 of signal_a to bit 2 of signal_b.
The part select limits must be constant values.  The part select limits cannot be variables.  You can use a case statement with a case branch for each possible part select limit.

Concatenation
Example:
For a 8-bit signal declared as,
wire [7:0] signal_a;
and two 4-bit signals declared as,
wire [3:0] signal_b, signal_c;
the signal assignment statement,
assign signal_a = {signal_b,signal_c};
takes the concatenation of the two four-bit signals, signal_b and signal_c and assigns the value of those 8 bits to the eight-bit signal, signal_a.
Example:
Replication in concatenation:
For a 4-bit signal declared as
wire [3:0] c;
and a 4-bit signal declared as
wire [3:0] d;
the signal assignment statement,
assign d = {4{c[3]}};
concatenates 4 replicants of the msb of c and assigns the value of those 4 bits to the four-bit signal d.