28/09/2007
Data, der ikke kan behandles, er stort set ubrugelige. Der vil altid være en form for beregning påkrævet i digitale kredsløb og computersystemer. For at kunne beskrive denne logik og disse beregninger i et hardwarebeskrivelsessprog som Verilog, er det afgørende at have en dyb forståelse for de forskellige operatorer, sproget stiller til rådighed. Disse operatorer gør det muligt for syntese-værktøjer at realisere de passende hardwareelementer, fra simple logiske porte til komplekse aritmetiske enheder. Denne artikel giver en omfattende gennemgang af de forskellige typer operatorer i Verilog, deres funktioner, og hvordan de anvendes korrekt i design af digitale systemer.

Aritmetiske Operatorer i Verilog
Aritmetiske operatorer bruges til at udføre grundlæggende matematiske operationer. De er fundamentale i næsten ethvert digitalt design, der involverer talbehandling. Verilog understøtter de gængse operationer som addition, subtraktion, multiplikation, division, modulus og potensopløftning.
Det er vigtigt at være opmærksom på nogle specielle tilfælde:
- Hvis den anden operand i en divisions- (/) eller modulus- (%) operation er nul, vil resultatet være X (ukendt værdi).
- Hvis en af operanderne i en potensopløftnings- () operation er et reelt tal, vil resultatet også være et reelt tal.
- Resultatet af en potensopløftning er 1, hvis den anden operand (eksponenten) er 0 (f.eks. a 0 resulterer i 1).
Oversigt over Aritmetiske Operatorer
| Operator | Beskrivelse |
|---|---|
| a + b | a plus b (Addition) |
| a - b | a minus b (Subtraktion) |
| a * b | a multipliceret med b (Multiplikation) |
| a / b | a divideret med b (Division) |
| a % b | a modulus b (Rest ved division) |
| a b | a opløftet i b's potens (Potensopløftning) |
Relationelle Operatorer
Relationelle operatorer bruges til at sammenligne to operander. Resultatet af et sådant udtryk er altid en enkelt bit: 1 hvis udtrykket er sandt, og 0 hvis det er falsk. Hvis en af operanderne indeholder en X (ukendt) eller Z (høj impedans) bit, vil resultatet af sammenligningen være X. Disse operatorer har lavere præcedens end aritmetiske operatorer, men alle relationelle operatorer har samme præcedens indbyrdes.
Liste over Relationelle Operatorer
| Operator | Beskrivelse |
|---|---|
| a < b | a er mindre end b |
| a > b | a er større end b |
| a <= b | a er mindre end eller lig med b |
| a >= b | a er større end eller lig med b |
Ligestillingsoperatorer: En Dybdegående Analyse
Ligestillingsoperatorer bruges også til sammenligning, men de fokuserer specifikt på lighed og ulighed. De har lavere præcedens end relationelle operatorer. Her er det afgørende at forstå forskellen mellem logisk lighed (==, !=) og case-lighed (===, !==).
Logisk Ligestilling (== og !=)
Disse operatorer sammenligner to operander bit for bit. Hvis begge operander er identiske, returnerer `==` værdien 1 (sand). Hvis de er forskellige, returneres 0 (falsk). Den afgørende detalje er, at hvis en eller flere bits i en af operanderne er X eller Z, kan resultatet blive X (ukendt). Dette afspejler usikkerheden i hardwaren.

Case-ligestilling (=== og !==)
Case-ligestillingsoperatorerne `===` (case equality) og `!==` (case inequality) udfører en eksakt bit-for-bit sammenligning. I modsætning til logisk lighed, behandler disse operatorer X og Z værdier som gyldige logiske tilstande, der kan sammenlignes. Det betyder, at for at `a === b` skal være sand, skal hver eneste bit i `a`, inklusiv eventuelle X'er og Z'er, matche den tilsvarende bit i `b`. Resultatet af en case-ligestillingsoperation vil altid være enten 0 eller 1; det vil aldrig blive X.
Sammenligningstabel: == vs. ===
| Udtryk | Resultat med `==` | Resultat med `===` | Forklaring |
|---|---|---|---|
| 4'b1010 == 4'b1010 | 1 (sand) | 1 (sand) | Begge operander er identiske. |
| 4'b101x == 4'b1010 | X (ukendt) | 0 (falsk) | `==` giver X pga. 'x'-bitten. `===` ser 'x' og '0' som forskellige. |
| 4'b101x === 4'b101x | 1 (sand) | 1 (sand) | `===` bekræfter, at 'x' er lig med 'x' på den samme position. |
Logiske Operatorer
Logiske operatorer evaluerer udtryk som sande eller falske. En operand** betragtes som falsk, hvis den er lig med nul, og sand, hvis den er forskellig fra nul. Hvis en operand indeholder en X-bit, kan den potentielt gøre hele udtrykket ukendt.
- Logisk AND (&&): Returnerer 1, hvis begge operander er sande (ikke-nul). Returnerer 0, hvis mindst én operand er falsk (nul).
- Logisk OR (||): Returnerer 1, hvis mindst én af operanderne er sand (ikke-nul). Returnerer 0, kun hvis begge er falske (nul).
- Logisk NOT (!): Inverterer den logiske værdi af en operand. En sand (ikke-nul) værdi bliver til 0 (falsk), og en falsk (nul) værdi bliver til 1 (sand).
Bitvise Operatorer
I modsætning til logiske operatorer, der behandler en hel operand som en enkelt sand/falsk værdi, arbejder bitvise operatorer på de individuelle bits i operanderne. Hver bit i den første operand kombineres med den tilsvarende bit i den anden operand for at producere en resultatbit.
Liste over Bitvise Operatorer
| Operator | Beskrivelse |
|---|---|
| ~a | Bitvis NOT (inverterer hver bit) |
| a & b | Bitvis AND |
| a | b | Bitvis OR |
| a ^ b | Bitvis XOR (Exclusive OR) |
| a ~^ b eller a ^~ b | Bitvis XNOR (Exclusive NOR) |
Skifteoperatorer (Shift Operators)
Skifteoperatorer bruges til at flytte bits i en vektor til venstre eller højre. Dette er en yderst effektiv måde at udføre multiplikation eller division med potenser af 2 på. Verilog har to typer skifteoperatorer: logiske og aritmetiske.
Logisk Skift (<< og >>)
Ved et logisk skift flyttes alle bits et bestemt antal positioner. De tomme positioner, der opstår som følge af skiftet, fyldes altid op med nuller. Dette er velegnet til at arbejde med usignerede tal.

a << n: Skifter bits i `a` `n` positioner til venstre. De `n` mindst betydende bits (LSB) fyldes med 0.a >> n: Skifter bits i `a` `n` positioner til højre. De `n` mest betydende bits (MSB) fyldes med 0.
Aritmetisk Skift (<<< og >>>)
Et aritmetisk skift er designet til at bevare fortegnet på et signeret tal. Ved et aritmetisk venstreskift (`<<<`) opfører det sig som et logisk venstreskift og fylder med nuller. Ved et aritmetisk højreskift (`>>>`) fyldes de tomme MSB-positioner med værdien af den oprindelige fortegnsbit. Hvis tallet var negativt (fortegnsbit = 1), fyldes der med 1'ere. Hvis det var positivt (fortegnsbit = 0), fyldes der med 0'er.
Ofte Stillede Spørgsmål (FAQ)
Hvad er den primære forskel mellem `==` og `===`?
Den primære forskel ligger i, hvordan de håndterer de specielle logiske værdier X (ukendt) og Z (høj impedans). `==` (logisk lighed) kan give et X-resultat, hvis en af operanderne indeholder X eller Z. `===` (case-lighed) udfører en streng bit-for-bit sammenligning og vil altid returnere enten 1 (sand) eller 0 (falsk), da den behandler X og Z som gyldige, sammenlignelige værdier.
Hvornår skal man bruge en bitvis operator frem for en logisk operator?
Brug en bitvis operator (f.eks. `&`, `|`), når du har brug for at manipulere individuelle bits i en dataværdi, f.eks. ved at maskere bestemte bits. Brug en logisk operator (f.eks. `&&`, `||`), når du skal evaluere et helt udtryk eller en betingelse som enten sand eller falsk, typisk i kontrolstrukturer som `if` eller `while` loops.
Hvad er forskellen på et logisk og et aritmetisk højreskift?
Et logisk højreskift (`>>`) fylder altid de nye, mest betydende bits (MSB) med nuller. Dette er passende for usignerede tal. Et aritmetisk højreskift (`>>>`) fylder de nye MSB'er med en kopi af den oprindelige fortegnsbit. Dette bevarer tallets fortegn og er afgørende, når man arbejder med signerede tal i 2's komplement-format.
Hvis du vil læse andre artikler, der ligner En Komplet Guide til Verilog Operatorer, kan du besøge kategorien Teknologi.
